哪个更好 ?循环内核或CUDA GPU的循环内核

时间:2012-11-25 17:01:11

标签: cuda gpu gpu-programming

Device GeForce GTX 680

在程序中,我有很长的数组要在内核中处理。(大约1 GB的整数)。根据需要,我的数组按顺序分成块,有些重叠(块之间的重叠是k)。我有每个块的固定大小(块大小是m)。现在,数组将按顺序(0,m)(m-k,(m-k)+ m),....分割。)

按照上面的计算,我的程序中所需的块数不会大约(1GB / m) 由于GPU的总块数有限,我该如何有效地做到这一点? 我是否应该从主机以迭代方式调用内核而内核中没有任何循环? 或者我应该调用内核一次然后在内核中循环多次迭代? 或者我应该只调用内核一次,总的没有块=(1 GB / m)?

对于此程序的块数以及使用哪种方法,可以作为最佳值?

1 个答案:

答案 0 :(得分:1)

我会为您的应用的第一个版本建议以下序列:

初​​始化:

  • 在GPU上为GPU上的两个非重叠的块(插槽1和2)分配空间
  • 将第一个非重叠块复制到插槽1

循环:

  • 将下一个非重叠块复制到插槽2
  • 运行在插槽1上运行并部分在插槽2中运行的内核
  • 将插槽2的内容复制到插槽1(GPU到GPU内存复制)

在更高版本中,您可以通过交替复制到插槽1和插槽2并将寻址包装在内核中来避免GPU到GPU复制,这样它就不会溢出插槽2,而是从插槽1的开头开始。可以把它想象为插槽1和插槽2被安排到环形缓冲区中。您还可以通过添加更多插槽并在内核在先前插槽上运行时异步将阵列块复制到新插槽来提高性能。