我在visual C++中制作了一个动态链接库文件,用于计算CUDA中复数组的模数。该数组的类型为cufftComplex。然后,我调用LabVIEW中的Dll来检查结果的准确性。我收到一个不正确的结果。有人能告诉我下面的代码出了什么问题吗?我认为我的内核函数应该有问题(我检索cufftComplex数据的方式应该是不正确的)。
#include <math.h>
#include <cstdlib>
#include <cuda_runtime.h>
#include <cufft.h>
extern "C" __declspec(dllexport) void Modulus(cufftComplex *digits,float *result);
__global__ void ModulusComputation(cufftComplex *a, int N, float *temp)
{
int idx = blockIdx.x*blockDim.x + threadIdx.x;
if (idx<N)
{
temp[idx] = sqrt((a[idx].x * a[idx].x) + (a[idx].y * a[idx].y));
}
}
void Modulus(cufftComplex *digits,float *result)
{
#define N 1024
cufftComplex *d_data;
float *temp;
size_t size = sizeof(cufftComplex)*N;
cudaMalloc((void**)&d_data, size);
cudaMalloc((void**)&temp, sizeof(float)*N);
cudaMemcpy(d_data, digits, size, cudaMemcpyHostToDevice);
int blockSize = 16;
int nBlocks = N/blockSize;
if( N % blockSize != 0 )
nBlocks++;
ModulusComputation <<< nBlocks, blockSize >>> (d_data, N,temp);
cudaMemcpy(result, temp, size, cudaMemcpyDeviceToHost);
cudaFree(d_data);
cudaFree(temp);
}
发布于 2012-10-06 17:20:50
在代码的最终cudaMemcpy中,您拥有:
cudaMemcpy(result, temp, size, cudaMemcpyDeviceToHost);
它应该是:
cudaMemcpy(result, temp, sizeof(float)*N, cudaMemcpyDeviceToHost);
如果你在你的cuda调用中包含了错误检查,你就会看到这个cuda调用(就像最初写的那样)抛出一个错误。
还可以做一些其他的评论。例如,您的块大小(16)应该是32的整数倍。但这并不妨碍正常操作。
发布于 2012-10-06 17:15:09
在内核调用之后,当复制回结果时,您使用size
作为内存大小。cudaMemcpy
的第三个参数应该是N * sizeof(float)
。
https://stackoverflow.com/questions/12761727
复制相似问题