我要编写一个 CUDA 内核来对矩阵的每个元素执行单个操作(例如,对每个元素求平方根,或求幂,或者如果所有数字都在 [-1;1] 之间,则计算正弦/余弦)等..)
我选择了 block /线程网格维度,我认为代码非常简单明了,但我在问自己......我可以做些什么来最大化合并/SM 占用?
我的第一个想法是:让所有 semiwarp(16 个线程)从全局内存加载数据集合,然后将它们全部用于计算,但它发现没有足够的内存传输/计算并行化。我的意思是所有线程加载数据,然后计算,然后再次加载数据,然后再次计算。这听起来性能很差。
我认为使用共享内存会很棒,也许使用某种局部性使线程加载比它实际需要的数据更多的数据以促进其他线程的工作,但这听起来也很愚蠢,因为第二个会等待前者在开始工作之前完成加载数据。
我不太确定我对我的问题给出了正确的想法,我只是在开始处理具体的事情之前得到一些想法。
每一条评论/建议/批评都被很好地接受了,谢谢。
最佳答案
如果您定义了网格以便线程沿着包含矩阵的数组的主要维度读取,那么您已经保证了合并内存访问,并且几乎没有其他事情可以提高性能。这些复杂度为 O(N) 的运算确实不包含足够的算术强度,无法通过优化的 CPU 实现提供良好的并行加速。通常最好的策略是将多个 O(N) 操作融合到一个内核中,以提高 FLOP 与内存事务的比率。
关于c++ - CUDA - 对矩阵的单个元素的操作 - 获得想法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5539219/