用于分组子4字节写入的优秀CUDA习惯用法是什么?

时间:2017-02-21 20:36:53

标签: c++ cuda

当我编写模板化的CUDA代码时,我经常会遇到以下问题:我实现了一些漂亮的模板化设备函数,它主要是内存瓶颈,隐含地关注输入,输出中的4字节或8字节数据, 或两者。当我为这些较大的类型计时时,我会得到合理的数字;但是,如果我把它用于短期或者特色,那么吞吐量会急剧下降。一个(不完整的)例子:

template<typename T>
__global__ magic_kernel(
    T* __restrict__ result_in_global_mem,
    // all sort of other parameters here
)
{
    // calculate something...

    // now write the results to global memory
    for(size_t pos = global_thread_index(); pos < length; pos++) {
        T single_result = get_something_we_calculated(pos, other, params);
        final_result_in_global_mem[pos] = single_result;
    }

在某些情况下,看起来像是一个明显分开的例子,将最终输出写回全局存储器&#34;在代码部分,我使用if (sizeof(T) == 1 or sizeof(T) == 2) { } else { }重写它,并一次进行4或2次写入(例如,通过`缓冲变量&#39;大小为4)。

但是:

  • 我开始使用这种方法进行相当多的代码重复,
  • 有读取和写入,我不希望我的代码爆炸
  • 有时写入或读取有点散布在代码中,并且不会发生在一个地方(尽管它们通常仍然是完整的经线读取或写入)。

所以我想知道是否有一个有用的习惯用于分组这些多子4字节写入,以便warp完全4x32合并写入;也许是通过一个小型队列课程,即#34; fires&#34;当占用率达到四个字节时实际写入?并且有点保证编译成寄存器使用而不是"local" memory

注意:我正在编写C ++ 11ish CUDA - 非常欢迎使用这些语言功能而不是某些C-ish方法提出建议。

0 个答案:

没有答案