【问题标题】:Efficient CUDA FFT with a spike带尖峰的高效 CUDA FFT
【发布时间】:2020-07-05 03:20:49
【问题描述】:

我有一个填充了一些值的固定数组,我正在尝试用频域中的尖峰执行这个数组的卷积。尖峰意味着数组中的所有值都为零,除了一个地方,例如 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 复杂类型的尖峰阵列?您还可以假设我有一个包含 100 万个索引的数组。执行此卷积的最佳策略是什么?我应该在主机上创建这个尖峰,然后移动并执行 fft、convolve 和 ifft 吗?或者我应该如何在 GPU 上即时创建它?

【问题讨论】:

    标签: cuda fftw


    【解决方案1】:

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

    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);
    }
    

    [注意:代码编写在浏览器中,从未编译或运行,使用风险自负]

    这使用grid-stride loop 设计模式,您可以在博客链接中阅读更多相关信息。请注意,您的代码使用浮点数,但您的文本提到“cufft 复杂类型”,因此我将代码作为模板呈现。按照您认为合适的方式对其进行修改。这应该在性能上接近 cudaMemset 调用,但通过将所有内容融合在一起来减少延迟

    【讨论】:

    • 感谢您的回答。此外,如果这个尖峰数组的大小小于 10,000 怎么办......如果条件的单片内核会比网格步长循环设计提供更好的性能吗?
    • 应该没什么区别
    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 2014-05-29
    相关资源
    最近更新 更多