-1

CUDAを学んでいます。今日、私は本の中のいくつかのコードを試してみました: CUDA Application Design And Development、それは私を驚かせました. なぜCUDA推力はとても遅いのですか? コードと出力は次のとおりです。

#include <iostream>
using namespace std;

#include<thrust/reduce.h>
#include<thrust/sequence.h>
#include<thrust/host_vector.h>
#include<thrust/device_vector.h>
#include <device_launch_parameters.h>

#include "GpuTimer.h"

__global__ void fillKernel(int *a, int n)
{
    int tid = blockDim.x * blockIdx.x + threadIdx.x;
    if(tid <n) a[tid] = tid;
}

void fill(int *d_a, int n)
{
    int nThreadsPerBlock = 512;
    int nBlock = n/nThreadsPerBlock + ((n/nThreadsPerBlock)?1:0);
    fillKernel<<<nBlock, nThreadsPerBlock>>>(d_a, n);
}

int main()
{
    const int N = 500000;
    GpuTimer timer1, timer2;

    thrust::device_vector<int> a(N);

    fill(thrust::raw_pointer_cast(&a[0]), N);

    timer1.Start();
    int sumA = thrust::reduce(a.begin(), a.end(), 0);
    timer1.Stop();

    cout << "Thrust reduce costs " << timer1.Elapsed() << "ms." << endl;

    int sumCheck = 0;
    timer2.Start();
    for(int i = 0; i < N; i++)
        sumCheck += i;
    timer2.Stop();

    cout << "Traditional reduce costs " << timer2.Elapsed() << "ms." << endl;
    if (sumA == sumCheck)
        cout << "Correct!" << endl;
    return 0;
}

ここに画像の説明を入力

4

1 に答える 1

5

有効な比較がありません。あなたの GPU コードはこれを行っています:

int sumA = thrust::reduce(a.begin(), a.end(), 0);

あなたのCPUコードはこれを行っています:

for(int i = 0; i < N; i++)
    sumCheck += i;

この方法論には非常に多くの問題があり、どこから始めればよいかわかりません。まず第一に、GPU 操作は有効なリダクションであり、 vector 内の数値のシーケンスに対して有効な結果をもたらしますa。に 1 から N までのシーケンスがある場合がありますが、そのようにする必要aはなく、正しい結果が得られます。CPU コードは、1 から N の特定のシーケンスに対してのみ正しい答えを返します。次に、スマート コンパイラは、CPU コード全体を最適化し、ループ全体を定数代入ステートメントに本質的に削減できる場合があります。(1 から N までの合計は (N+1)(N/2) ですよね?) CPU 側の内部でどのような最適化が行われているのかわかりません。

より有効な比較は、両方のケースで実際の任意の削減を行うことです。例としては、デバイス ベクターでの推力::削減操作とホスト ベクターでの操作のベンチマークを行うことがあります。または、1 から N までの整数を合計するのではなく、実際にベクトルを操作する独自のシリアル CPU リダクション コードを記述します。

また、コメントに示されているように、真剣に助けが必要な場合は、実行しているハードウェアおよびソフトウェア プラットフォームなどを文書化し、すべてのコードを提供してください。GPUtimer が何をするのかわかりません。私はこれを「ローカライズしすぎている」として締めくくることに投票します。

于 2013-03-07T15:52:58.243 に答える