首页 文章

CUDA中cufftComplex数据类型数组的模数计算

提问于
浏览
2

我在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);

}

2 回答

  • 1

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

    cudaMemcpy(result, temp, size, cudaMemcpyDeviceToHost);
    

    它应该是:

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

    如果你已经包含了你的cuda调用的错误检查,你会看到这个cuda调用(如最初编写的)抛出一个错误 .

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

  • 2

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

相关问题