首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CUDA:归约还是原子操作?

CUDA:归约还是原子操作?
EN

Stack Overflow用户
提问于 2011-05-08 05:01:35
回答 7查看 9.4K关注 0票数 3

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

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

我不能使用原子操作,因为同时有读操作和写操作,所以线程不能被synchthread同步。

你有没有其他的想法?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-05-08 07:04:37

这是在CUDA中执行缩减的常用方法

在每个块内,

1)在共享内存中为每个线程保留一个正在运行的缩减值。因此,每个线程将从全局内存中读取n(我个人更喜欢在16到32之间)值,并从这些值中更新减少的值

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

这样,您不需要比(线程数)* sizeof (datatye)字节更多的共享内存。

由于每个块都有一个约简值,因此您将需要执行第二次约简遍以获得最终值。

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

因此,给定100万个元素,您将需要在第一次遍历中启动大约250个块,而在第二次遍历中只需要启动一个块。

当此配置的元素数量> (4096)^2时,您可能需要第三次遍历。

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

票数 5
EN

Stack Overflow用户

发布于 2011-05-09 20:40:49

您可能还想使用CUDA推力附带的缩减例程,它是CUDA4.0或可用的here的一部分。

该库由一对nVidia工程师编写,可与大量手工优化的代码相媲美。我相信还有一些网格/块大小的自动调整正在进行中。

通过封装原始设备指针,您可以轻松地与您自己的内核进行交互。

这是严格从快速集成的角度来看的。关于这一理论,请参阅tkerwin的答案。

票数 6
EN

Stack Overflow用户

发布于 2011-05-08 06:05:47

NVIDIA有一个CUDA演示,可以进行简化:here。有一份白皮书解释了设计背后的一些动机。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5923978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档