我需要在GPU上处理尺寸为K x N的二维阵列,其中K是一个小数字(3,4或5),N的值为百万到百万。 将一次对一列K个元素进行处理,这样每个列将由内核的单独调用处理。 在GPU上表示K x N阵列的最有效方法是什么:
1)在1-D数组中,将列的K个元素放在连续的位置,这样每个线程将处理元素K * thread_id,K * thread_id + 1,...,K * thread_id + K - 1
2)作为K个独立的1-D数组,其中每个数组存储1个原始数组;
3)别的东西
谢谢!
答案 0 :(得分:2)
选项2更适合您的情况。
选项2的数据布局可以看作是数组(SoA)的结构,而选项1是结构数组(AoS)。
通常,SoA优于用于GPU编程的AoS。关于这个主题有很多讨论,说明为什么SoA表现更好。
http://developer.download.nvidia.com/CUDA/training/introductiontothrust.pdf
由于每个线程逐个访问K个元素,因此选项1中的AoS布局会导致跨步内存访问,并且可能会影响性能,如下所述。
https://developer.nvidia.com/content/how-access-global-memory-efficiently-cuda-cc-kernels
虽然在您的情况下可以通过足够大的L2缓存放宽此问题,但避免使用AoS是获得更高性能的更强大方法。