我正在编写一个CUDA内核,它涉及到计算给定矩阵的最大值,并且我正在评估可能性。我能找到的最好的方法是:
强制每个线程在共享内存中存储一个值,然后使用缩减算法确定最大值(pro:最小散度缺点:共享内存在2.0设备上限制为48Kb )
我不能使用原子操作,因为同时有读操作和写操作,所以线程不能被synchthread同步。
你有没有其他的想法?
发布于 2011-05-08 07:04:37
这是在CUDA中执行缩减的常用方法
在每个块内,
1)在共享内存中为每个线程保留一个正在运行的缩减值。因此,每个线程将从全局内存中读取n(我个人更喜欢在16到32之间)值,并从这些值中更新减少的值
2)在块内执行约简算法,得到每个块的最终约简值。
这样,您不需要比(线程数)* sizeof (datatye)字节更多的共享内存。
由于每个块都有一个约简值,因此您将需要执行第二次约简遍以获得最终值。
例如,如果每个块启动256个线程,每个线程读取16个值,那么每个块可以减少(256 * 16 = 4096)个元素。
因此,给定100万个元素,您将需要在第一次遍历中启动大约250个块,而在第二次遍历中只需要启动一个块。
当此配置的元素数量> (4096)^2时,您可能需要第三次遍历。
您必须注意合并全局内存读取。您不能合并全局内存写入,但这是您需要承受的性能损失之一。
发布于 2011-05-09 20:40:49
您可能还想使用CUDA推力附带的缩减例程,它是CUDA4.0或可用的here的一部分。
该库由一对nVidia工程师编写,可与大量手工优化的代码相媲美。我相信还有一些网格/块大小的自动调整正在进行中。
通过封装原始设备指针,您可以轻松地与您自己的内核进行交互。
这是严格从快速集成的角度来看的。关于这一理论,请参阅tkerwin的答案。
发布于 2011-05-08 06:05:47
NVIDIA有一个CUDA演示,可以进行简化:here。有一份白皮书解释了设计背后的一些动机。
https://stackoverflow.com/questions/5923978
复制相似问题