3

我用 Visual C++ 制作了一个 Dll 文件来计算 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);

}
4

2 回答 2

3

在代码的最终 cudaMemcpy 中,您有:

 cudaMemcpy(result, temp, size, cudaMemcpyDeviceToHost); 

它应该是:

 cudaMemcpy(result, temp, sizeof(float)*N, cudaMemcpyDeviceToHost); 

如果您为您的 cuda 调用包含错误检查,您会看到这个 cuda 调用(如最初编写的那样)抛出一个错误。

还可以提出其他意见。例如,您的块大小 (16) 应该是 32 的整数倍。但这并不妨碍正确操作。

于 2012-10-06T17:20:49.940 回答
1

在内核调用之后,当复制回结果时,您使用size的是内存大小。的第三个参数cudaMemcpy应该是N * sizeof(float)

于 2012-10-06T17:15:09.073 回答