【发布时间】:2015-07-21 01:21:29
【问题描述】:
我正在使用 AVX2/SSE 指令并行化某个动态编程问题。
在计算的主要迭代中,我计算矩阵中的列,其中每个单元格都是 AVX2 寄存器的结构 (_m256i)。我使用前一个矩阵列中的值作为计算当前列的输入值。列可能很大,所以我要做的是我有一个结构数组(在堆栈上),其中每个结构都有两个 _m256i 元素。
结构:
struct Cell {
_m256i first;
_m256i second;
};
然后我有这样的数组:Cell prevColumn [N]。 N 通常会有几百个。
我知道_m256i 基本上代表一个 avx2 寄存器,所以我想知道我应该如何看待这个数组,它的行为如何,因为 N 远大于 16(这是 avx 寄存器的数量)?创建这样一个数组是一种好习惯,还是在存储大量即将真正重用的_m256i 值时应该使用一些更好的方法?
另外,我应该对这些结构进行调整吗?我读了很多关于对齐的文章,但我仍然不确定如何以及何时准确地做到这一点。
【问题讨论】:
-
简短回答:是的,您可以创建数组,但编译器可能不会将数组优化到寄存器中。
-
好的 - 相当小 - 这在桌面或服务器操作系统上应该不是问题。
-
不用担心加载/存储 - 反正你只有 16 个寄存器 - 现在让编译器和 L1 缓存处理所有事情。
-
与其考虑拥有一组 AVX/SSE 值,不如将其视为拥有一个对 SIMD 友好的 SoA or AosOA。
-
@Martinsos,
Cell在您存储或阅读时是一个SoA(例如typedef union __m256i { int8_t m256_i8[32]; int16_t m256_i16[16]; int32_t m256_i32[8]; } __256i;)。然后在Cell prevColumn [N]中,数组prevColumn是一个AoSoA。