首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CUDA中cufftComplex数据类型数组模数的计算

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

Stack Overflow用户
提问于 2012-10-07 00:46:46
回答 2查看 883关注 0票数 3

我在visual C++中制作了一个动态链接库文件,用于计算CUDA中复数组的模数。该数组的类型为cufftComplex。然后,我调用LabVIEW中的Dll来检查结果的准确性。我收到一个不正确的结果。有人能告诉我下面的代码出了什么问题吗?我认为我的内核函数应该有问题(我检索cufftComplex数据的方式应该是不正确的)。

代码语言:javascript
运行
复制
#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);

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-07 01:20:50

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

代码语言:javascript
运行
复制
 cudaMemcpy(result, temp, size, cudaMemcpyDeviceToHost); 

它应该是:

代码语言:javascript
运行
复制
 cudaMemcpy(result, temp, sizeof(float)*N, cudaMemcpyDeviceToHost); 

如果你在你的cuda调用中包含了错误检查,你就会看到这个cuda调用(就像最初写的那样)抛出一个错误。

还可以做一些其他的评论。例如,您的块大小(16)应该是32的整数倍。但这并不妨碍正常操作。

票数 3
EN

Stack Overflow用户

发布于 2012-10-07 01:15:09

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12761727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档