2

我正在使用 AVX2/SSE 指令并行化某个动态编程问题。

在我计算的主要迭代中,我计算矩阵中的列,其中每个单元格都是 AVX2 寄存器 ( _m256i) 的结构。我使用前一个矩阵列中的值作为计算当前列的输入值。列可能很大,所以我要做的是我有一个结构数组(在堆栈上),其中每个结构都有两个_m256i元素。

结构:

struct Cell {
  _m256i first;
  _m256i second;
};

然后我有这样的数组:Cell prevColumn [N]N通常会是几百。

我知道它_m256i基本上代表一个 avx2 寄存器,所以我想知道我应该如何看待这个数组,它的行为如何,因为 N 远大于 16(这是 avx 寄存器的数量)?创建这样一个数组是一种好习惯,还是在存储大量_m256i即将真正重用的值时我应该使用一些更好的方法?

另外,我应该对这些结构进行任何调整吗?我读了很多关于对齐的文章,但我仍然不确定如何以及何时准确地进行对齐。

4

1 回答 1

2

在继续之前,最好构造你的代码来做它可以做的所有事情。适合 L1 缓存的小缓冲区不会对性能太不利,但除非需要,否则不要这样做。

我认为用int []类型而不是__m256i类型的缓冲区编写代码更为典型,但我不确定。无论哪种方式都有效,并且应该得到编译以生成有效的代码。但这种int []方式意味着 SSE、AVX2 和 AVX512 版本的代码必须不同。并且它可能更容易使用调试器检查事物,将您的数据放在一个数组中,该数组的类型可以很好地格式化数据。

据我了解,加载/存储内在函数部分作为 and 之间的_m256i转换存在int [],因为 AVX 在未对齐时不会出错,只会在缓存线边界上减慢速度。分配给/从数组_m256i应该可以正常工作,并在需要时生成加载/存储指令,否则生成带有内存源操作数的向量指令。(以获得更紧凑的代码和更少的融合域微指令。)

于 2015-06-08T08:25:45.490 回答