intel - 是否可以创建大数组 AVX/SSE 值

标签 intel sse simd avx avx2

我正在使用 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 版本的不同代码更少。而且它可能会让使用调试器检查事物变得更容易,将数据放在一个数组中,并且其类型可以很好地格式化数据。

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

关于intel - 是否可以创建大数组 AVX/SSE 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30152408/

相关文章:

c++ - 加快一些 SSE2 Intrinsics 的颜色转换

c++ - 如何从标量初始化AltiVec寄存器而不使用复合文字

c - 使用 Streaming Simd Extensions (SSE) 的按位运算

c - 使用SIMD优化一维热方程

c - 使用 _mm256_load_ps() Intel 内在函数时出错

linux - 我可以从 x64 Linux 为 x86 Windows 编写程序集吗?

matlab - 如何在 Matlab 中使用 PARFOR 与 Core i3 并行 4

c++ - 关于销毁临时文件的编译器策略

c# - double 有没有可能比 float 快 2 倍?

c++ - SSE2 打包的 8 位整数有符号乘法(高半) : Decomposing a m128i (16x8 bit) into two m128i (8x16 each) and repack