从我在这里阅读的一些评论中,出于某种原因,对于像CUDA这样的并行实现,最好是Structure of Arrays
(SoA
)比Array of Structures
(AoS
)好吗?如果是这样,谁能解释为什么?
提前致谢!
最佳答案
选择AoS与SoA以获得最佳性能通常取决于访问模式。但是,这不仅限于CUDA-类似的考虑因素也适用于性能可能会受到内存访问模式显着影响的任何体系结构,例如您拥有高速缓存或通过连续内存访问(例如CUDA中的合并内存访问)性能更好的位置。
例如。对于RGB像素与单独的RGB平面:
struct {
uint8_t r, g, b;
} AoS[N];
struct {
uint8_t r[N];
uint8_t g[N];
uint8_t b[N];
} SoA;
如果您要同时访问每个像素的R/G/B组件,则AoS通常是有意义的,因为R,G,B组件的连续读取将是连续的,并且通常包含在同一缓存行中。对于CUDA,这还意味着内存读/写合并。
但是,如果您要分别处理色彩平面,则可能首选SoA,例如如果要按某个比例因子缩放所有R值,则SoA表示所有R分量将是连续的。
另一个考虑因素是填充/对齐。对于上方的RGB示例,AoS布局中的每个元素都与3个字节的倍数对齐,这对于CUDA,SIMD等可能不方便-在某些情况下,甚至可能需要在结构内填充以使对齐更方便(例如添加一个虚拟uint8_t元素以确保4字节对齐)。但是,在SoA情况下,这些平面是按字节对齐的,这对于某些算法/体系结构可能更方便。
对于大多数图像处理类型的应用程序,AoS场景更为常见,但是对于其他应用程序或特定的图像处理任务,情况并非总是如此。如果没有明显的选择,我建议将AoS作为默认选择。
另请参阅this answer,以获取有关AoS诉SoA的更多一般性讨论。
关于c++ - CUDA中数组的结构与结构的数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17924705/