具有尖峰的高效CUDA FFT

具有尖峰的高效CUDA FFT,cuda,fftw,Cuda,Fftw,我有一个固定的数组,里面填充了一些值,我试图用频域中的尖峰对这个数组进行卷积。Spike表示数组中除一个位置外的所有值均为零,例如a=[0,0,1,0,0,] 我必须创造这个尖峰大约100万次。。每次将值1放置在不同的索引中 float *spike = (float *) malloc(sizeof(float)*len); memset(spike,0,sizeof(float)*len); void compute_spike(float *spike, int ind) { spik

我有一个固定的数组,里面填充了一些值,我试图用频域中的尖峰对这个数组进行卷积。Spike表示数组中除一个位置外的所有值均为零,例如a=[0,0,1,0,0,] 我必须创造这个尖峰大约100万次。。每次将值1放置在不同的索引中

float *spike = (float *) malloc(sizeof(float)*len);
memset(spike,0,sizeof(float)*len);
void compute_spike(float *spike, int ind)
{
  spike[ind] = 1.0;

}

如何在GPU上高效地创建cufft复杂型spike阵列?你也可以假设我有一个100万个索引的数组。。执行这种卷积的最佳策略是什么?我应该在主机上创建这个尖峰,然后移动并进行fft、卷积和ifft吗?或者我应该如何在GPU上动态创建它?

鉴于PCI-e总线和GPU内存之间的带宽差异很大,在GPU内存中执行整个构造更有意义。我建议将memset操作和spike分配融合到一个内核中,比如

template<typename T>
__global__
void compute_spike(T* gpu_spike, int index, int N, T val)
{
    int tid = threadIdx.x + blockDim.x * blockIdx.x;
    int stride = blockDim.x * gridDim.x;

    for(; tid < N; tid += stride)  gpu_spike[tid] = (tid == index) ? val : T(0);
}
模板
__全球的__
无效计算峰值(T*gpu峰值,整数指数,整数N,T值)
{
int tid=threadIdx.x+blockDim.x*blockIdx.x;
int stride=blockDim.x*gridDim.x;
对于(;tid
[注意:在浏览器中编写的代码,从未编译或运行,使用自己的风险]


这使用了设计模式,您可以在博客链接上阅读更多关于它的信息。请注意,您的代码使用float,但您的文本中提到了“cufft complex type”,因此我将代码作为模板呈现。根据需要修改它。这在性能上应该接近于
cudaMemset
调用,但通过将所有内容融合在一起来减少延迟

鉴于PCI-e总线和GPU内存之间的巨大带宽差异,在GPU内存中执行整个构造更有意义。我建议将memset操作和spike分配融合到一个内核中,比如

template<typename T>
__global__
void compute_spike(T* gpu_spike, int index, int N, T val)
{
    int tid = threadIdx.x + blockDim.x * blockIdx.x;
    int stride = blockDim.x * gridDim.x;

    for(; tid < N; tid += stride)  gpu_spike[tid] = (tid == index) ? val : T(0);
}
模板
__全球的__
无效计算峰值(T*gpu峰值,整数指数,整数N,T值)
{
int tid=threadIdx.x+blockDim.x*blockIdx.x;
int stride=blockDim.x*gridDim.x;
对于(;tid
[注意:在浏览器中编写的代码,从未编译或运行,使用自己的风险]


这使用了设计模式,您可以在博客链接上阅读更多关于它的信息。请注意,您的代码使用float,但您的文本中提到了“cufft complex type”,因此我将代码作为模板呈现。根据需要修改它。这在性能上应该接近于
cudaMemset
调用,但通过将所有内容融合在一起来减少延迟

感谢您的回答。如果这个尖峰阵列的大小小于10000。。。具有if条件的单片内核会比网格跨步循环设计提供更好的性能吗?这应该和您的答案没有区别。如果这个尖峰阵列的大小小于10000。。。具有if条件的单片内核会比网格跨步循环设计提供更好的性能吗?这应该没有什么区别