CUDA:如何在GPU上有效地表示2-D阵列

时间:2013-03-20 09:34:13

标签: cuda

我需要在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)别的东西

谢谢!

1 个答案:

答案 0 :(得分:2)

选项2更适合您的情况。

选项2的数据布局可以看作是数组(SoA)的结构,而选项1是结构数组(AoS)。

通常,SoA优于用于GPU编程的AoS。关于这个主题有很多讨论,说明为什么SoA表现更好。

http://developer.download.nvidia.com/CUDA/training/introductiontothrust.pdf

http://my.safaribooksonline.com/book/-/9780123884268/chapter-6dot-efficiently-using-gpu-memory/st0045_b9780123884268000069

由于每个线程逐个访问K个元素,因此选项1中的AoS布局会导致跨步内存访问,并且可能会影响性能,如下所述。

https://developer.nvidia.com/content/how-access-global-memory-efficiently-cuda-cc-kernels

虽然在您的情况下可以通过足够大的L2缓存放宽此问题,但避免使用AoS是获得更高性能的更强大方法。