我正在使用 AVX2/SSE 指令并行化某个动态编程问题。
在计算的主要迭代中,我计算矩阵中的列,其中每个单元格都是 AVX2 寄存器的结构 (_m256i
)。我使用前一个矩阵列的值作为计算当前列的输入值。列可能很大,所以我所做的是有一个结构数组(在堆栈上),其中每个结构都有两个 _m256i
元素。
结构:
struct Cell {
_m256i first;
_m256i second;
};
然后我有这样的数组:Cell prevColumn [N]
。 N
通常是几百。
我知道_m256i
基本上代表了一个avx2寄存器,所以我想知道我应该如何看待这个数组,它的行为如何,因为N远大于16(这是avx的数量)寄存器)?创建这样的数组是一个很好的做法,还是在存储大量很快就会重用的 _m256i
值时应该使用一些更好的方法?
另外,我应该对这个结构进行任何调整吗?我读了很多关于对齐的内容,但我仍然不确定如何以及何时准确地进行对齐。
最佳答案
最好在继续之前构建您的代码,使其能够使用值执行所有操作。适合 L1 缓存的小缓冲区不会对性能造成太大影响,但除非需要,否则不要这样做。
我认为使用 int []
类型的缓冲区编写代码更为典型,而不是 __m256i
类型,但我不确定。无论哪种方式都有效,并且应该编译以生成有效的代码。但 int []
方式意味着 SSE、AVX2 和 AVX512 版本的不同代码更少。而且它可能会让使用调试器检查事物变得更容易,将数据放在一个数组中,并且其类型可以很好地格式化数据。
据我了解,加载/存储内在函数部分是作为 _m256i
和 int []
之间的转换存在的,因为 AVX 不会在未对齐时出错,只是在缓存行边界上减慢。从 _m256i
数组进行赋值应该可以正常工作,并在需要时生成加载/存储指令,否则生成带有内存源操作数的向量指令。 (为了更紧凑的代码和更少的融合域微指令。)
关于intel - 是否可以创建大数组 AVX/SSE 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30152408/