首先,我是 CUDA 的新手,我正在努力学习,所以也许我做错了什么。我想将 CUDA 性能与使用 Intel 内在函数实现的等效函数进行比较,期望 CUDA 会产生更好的结果。
但令我惊讶的是,这不是我所看到的。我的函数非常简单,我只需添加两个向量并将结果存储在第三个向量中。我的 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 调用,而不是内存设置和所有内容,但无论调用内核的方法如何,英特尔内在函数版本(使用 8 元素数组)只是将 CUDA 从水。基本上,该功能的英特尔 SIMD 版本快 10 倍!
我没想到会这样,所以我把这归因于我是 CUDA 的新手。那么我做错了什么?我认为 CUDA 在这类事情上应该要快得多,我想我一定没有正确使用它或其他什么。
如果您有一些见解,我将不胜感激!
谢谢!