我在GPU内存中有一个大矩形矩阵NxM,以逐行表示形式存储为一维数组。让我们说这个矩阵实际上是由大小为nxm的子矩阵组成的。为简单起见,假设N是n的倍数并且与M和m相同。我们假设,数组的数据类型是float或double。
找到每个子矩阵中极值的索引有什么有效的方法?例如,如何找到每个子矩阵的最大元素的1维索引,并在某些数组中记下这些索引。
答案 0 :(得分:2)
我很难想象如此自信(或傲慢?)说一个特定的解决方案是“最有效的方式”做某事。
然而,一些想法(没有声称涵盖“最有效”的解决方案):
我认为基本上有两种“正交”方式来接近这个
哪一个更合适的问题可能取决于矩阵的大小。你提到“N是n的倍数”(类似于M和m)。设大小M x N
的矩阵由大小为a*b
的{{1}}子矩阵组成。
对于第一种方法,可以简单地让每个线程处理一个子矩阵,使用像
这样的简单循环m x n
这里的先决条件是for (all elements of my sub-matrix) max = element > max ? element : max;
“相当大”。也就是说,当你可以为10000个子矩阵启动这个内核时,这可能已经带来了一个很好的加速。
与此相反,在第二种方法中,每个内核(包含其所有线程)将处理一个子矩阵。在这种情况下,内核可以是标准的“简化”内核。 (减少通常是“计算数组元素的总和/乘积”的一个例子,但它适用于任何二进制关联操作,因此不是计算总和或产品,基本上可以使用相同的内核进行计算最小或最大)。因此,将为每个子矩阵启动内核,这只有在子矩阵“相当大”时才有意义。
但是,在两个案例中,必须考虑一般性能指南。特别是,因为在这种情况下,操作显然是内存限制的(而不是计算限制的),必须确保对全局内存(即,到矩阵本身)的访问是合并的,并且占用是由内核创建的尽可能高。
编辑:当然,人们可以考虑以某种方式结合这些方法,但我认为它们至少显示了可用选项空间中最重要的方向。