0

设备 GeForce GTX 680

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

根据上面的计算,我的程序中不需要的块大约是 (1GB / m) 由于 GPU 中的块总数是有限的,我怎样才能有效地做到这一点?我应该从主机以迭代方式调用内核,而内核内部没有任何循环吗?或者我应该调用内核一次,然后在内核内部循环进行多次迭代?还是我应该只调用一次内核,总块数=(1 GB / m)?

什么可以作为该程序的块数的最佳值以及什么方法?

4

1 回答 1

1

对于您的应用程序的第一个版本,我建议以下顺序:

在里面:

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

环形:

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

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

于 2012-11-25T19:26:11.107 回答