小编典典

CUDA:还原还是原子运算?

algorithm

我正在编写一个CUDA内核,其中涉及在给定矩阵上计算最大值,并且我正在评估可能性。我能找到的最好方法是:

强制每个线程在共享内存中存储一​​个值,然后使用缩减算法确定最大值(优点:最小差异缺点:2.0设备上共享内存限制为48Kb)

我无法使用原子操作,因为同时具有读取和写入操作,因此线程无法通过synchthreads进行同步。

还有其他想法吗?


阅读 244

收藏
2020-07-28

共1个答案

小编典典

这是减少CUDA的常用方法

在每个区块中

1)在每个线程的共享内存中保持一个递减的值。因此,每个线程将从全局内存中读取n个值(我个人比较喜欢16和32之间的值),值,并从这些值中更新减少的值

2)在块内执行约简算法,以使每个块获得一个最终的约简值。

这样,您不需要的共享内存多于(线程数)* sizeof(数据类型)字节。

由于每个块都有一个减少的值,因此您将需要执行第二次减少以获取最终值。

例如,如果每个块启动256个线程,并且每个线程读取16个值,则每个块可以减少(256 * 16 = 4096)个元素。

因此,给定一百万个元素,您将需要在第一遍中启动大约250个块,在第二遍中仅启动一个块。

对于这种配置,如果元素数>(4096)^ 2,则可能需要第三次通过。

您将必须注意全局内存读取已合并。您无法合并全局内存写入,但这是您需要承受的性能损失。

2020-07-28