【问题标题】:Which is better ? Loop inside kernel or Looping kernels for CUDA GPU哪个更好 ?循环内核或循环内核用于 CUDA GPU
【发布时间】:2012-11-26 03:26:11
【问题描述】:

设备 GeForce GTX 680

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

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

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

【问题讨论】:

    标签: cuda gpu


    【解决方案1】:

    我建议您应用的第一个版本的顺序如下:

    初始化:

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

    循环:

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

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

    【讨论】:

    • 那么理想的内核调用和每个内核的块数应该是多少?
    • 我认为一个好的经验法则是至少有一个线程来填充每个内核中管道中的每个插槽。比这更多的线程不会影响性能,但也无济于事。那时,这对您来说是最方便的。据我所知,NVIDIA 并没有透露流水线的延迟,但可能在 10 个时钟左右。如果是这样,您应该尝试安排至少 1536 个内核 * 10 时钟延迟 = 每个内核 15360 个线程。
    • 很难说每个块应该有多少线程。您可以使用 CUDA 占用计算器(包含在 CUDA 中)来获取有关此数字的建议。但是,您还应该尝试与计算器提供的数字和结果的时间相比上下调整它。 128和256是常用的。你希望这个数字能被 32 整除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2017-03-01
    • 2014-07-05
    • 2021-03-01
    相关资源
    最近更新 更多