0

まず第一に、私は CUDA を初めて使用し、学習しようとしているので、何か間違っている可能性があります。CUDA のパフォーマンスと Intel の組み込み関数で実装された同等の関数を比較して、CUDA の方がより良い結果が得られることを期待しました。

驚いたことに、それは私が見ているものではありません。私の関数は非常に単純です。2 つのベクトルを追加し、結果を 3 番目のベクトルに格納するだけです。私のCUDAコードは、私が持っているセットアップ機能で、それが得るのと同じくらい基本的です:

void cudaAddVectors(float* vectorA, float* vectorB, float* sum, int numElements)
{
//
// Allocate the memory on the device
//
float* dvA;
float* dvB;
float* dvC;

cudaMalloc((void**)&dvA, numElements * sizeof(float));
cudaMalloc((void**)&dvB, numElements * sizeof(float));
cudaMalloc((void**)&dvC, numElements * sizeof(float));

//
// Copy the host vectors to device vectors
//
cudaMemcpy(dvA, vectorA, numElements * sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(dvB, vectorB, numElements * sizeof(float), cudaMemcpyHostToDevice);

//
// Perform the sum on the device and time it
//
deviceSumLink(dvA, dvB, dvC, numElements);

//
// Now get the results back to the host
//
cudaMemcpy(sum, dvC, numElements * sizeof(float), cudaMemcpyDeviceToHost);

// Cleanup and go home
cudaFree(dvA);
cudaFree(dvB);
cudaFree(dvC);

}

デバイス コードは、次のようにブロックまたはスレッドで実行されます。

void deviceSumLink(float* a, float* b, float* c, int numElements)
{
    //deviceSum<<<numElements, 1>>>(a,b,c);
    deviceSumThreads<<<1, numElements>>>(a,b,c);
}

そして、デバイス上で実行されている実際のコード:

__global__ void deviceSum(float* a, float* b, float* c)
{
    int index = blockIdx.x;
    c[index] = a[index] + b[index];
}

また

__global__ void deviceSumThreads(float* a, float* b, float* c)
{
    int index = threadIdx.x;
    c[index] = a[index] + b[index];
}

これの Intel バージョンと異なるサイズのベクトルを合計する CUDA の時間を測定し、両方が正確な結果を生成することを確認しました。CUDA 呼び出しについては、deviceSumLink 呼び出しのみのタイミングを計っています。メモリのセットアップやその他すべてではありませんが、カーネルを呼び出す方法に関係なく、Intel の組み込みバージョン (8 要素配列を使用) は、CUDA を喫煙しているだけです。水。基本的に、Intel SIMD バージョンの関数は 10 倍高速です。

私はこれを予期していなかったので、これは私が CUDA の完全な初心者であることに起因すると考えています。それで、私は何を間違っていますか?私はCUDAがそのようなことではるかに速いはずだと思っていました.私はそれを正しく使用していないに違いないと思います.

少しでもお分かりになりましたら、コメントよろしくお願いします!

どうも!

4

1 に答える 1