1

我需要在 GPU 上处理尺寸为 K x N 的二维数组,其中 K 是一个小数(3、4 或 5),而 N 的值是几百万到几百万。每次将针对一列 K 个元素进行处理,这样每一列都将由内核的单独调用来处理。在 GPU 上表示 K x N 数组的最有效方法是什么:

1)在一维数组中,将一列的K个元素放在连续的位置,这样每个线程都会处理元素K*thread_id, K*thread_id + 1, ..., K*thread_id + K - 1

2)作为K个单独的一维数组,其中每个数组存储1行原始数组;

3) 别的东西

谢谢!

4

1 回答 1

2

选项 2 更适合您的情况。

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

一般来说,对于 GPU 编程,SoA 优于 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 是获得更高性能的更可靠的方法。

于 2013-03-20T10:01:15.717 回答