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、メモリサイズとして使用しています。の3番目の引数はcudaMemcpyですN * sizeof(float)

于 2012-10-06T17:15:09.073 に答える