当我编写模板化的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方法提出建议。