我正在编写一个CUDA内核,其中涉及在给定矩阵上计算最大值,并且我正在评估可能性。我能找到的最好方法是:
强制每个线程在共享内存中存储一个值,然后使用缩减算法确定最大值(优点:最小差异缺点:2.0设备上共享内存限制为48Kb)
我无法使用原子操作,因为同时具有读取和写入操作,因此线程无法通过synchthreads进行同步。
还有其他想法吗?
这是减少CUDA的常用方法
在每个区块中
1)在每个线程的共享内存中保持一个递减的值。因此,每个线程将从全局内存中读取n个值(我个人比较喜欢16和32之间的值),值,并从这些值中更新减少的值
2)在块内执行约简算法,以使每个块获得一个最终的约简值。
这样,您不需要的共享内存多于(线程数)* sizeof(数据类型)字节。
由于每个块都有一个减少的值,因此您将需要执行第二次减少以获取最终值。
例如,如果每个块启动256个线程,并且每个线程读取16个值,则每个块可以减少(256 * 16 = 4096)个元素。
因此,给定一百万个元素,您将需要在第一遍中启动大约250个块,在第二遍中仅启动一个块。
对于这种配置,如果元素数>(4096)^ 2,则可能需要第三次通过。
您将必须注意全局内存读取已合并。您无法合并全局内存写入,但这是您需要承受的性能损失。