阵列中的 AVX 对齐

Posted

技术标签:

【中文标题】阵列中的 AVX 对齐【英文标题】:AVX alignment in array 【发布时间】:2014-07-29 13:52:01 【问题描述】:

我正在使用 MSVC12 (Visual Studio 2013 Express),并尝试实现 8*8 浮点值的快速乘法。问题是对齐:向量实际上有 9*n 个值,但我总是只需要前 8 个,例如对于 n=0,保证 32 个字节的对齐(当我使用 _mm_malloc 时),对于 n=1,“第一个”值以 4*9 = 36 个字节对齐。

for(unsigned i = 0; i < n; i++) 
    float *coeff_set = (float *)_mm_malloc(909 * 100 *sizeof(float), 32);
    // this works for n=0, not n=1, n=2, ...
    __m256 coefficients = _mm256_load_ps(&coeff_set[9 * i]);
    __m256 result = _mm256_mul_ps(coefficients, coefficients);

    ...

有没有办法解决这个问题?我想保留我的数据结构,但如果不可能,我会改变它。我发现的一个解决方案是先将 8 个浮点数复制到对齐的数组中,然后再加载它,但是性能损失太高了。

【问题讨论】:

我认为您的意思是 i=0i=1,而不是 n。至于对齐,您实际上只有几个选择:要么将结构填充到 16 个值以保持对齐,要么使用 _mm256_loadu_ps 进行未对齐的加载。 非常感谢您的建议!我没见过这种内在!代码有效(是的,我的意思是i,而不是n 好的,我将其转移到答案中。 【参考方案1】:

你有两个选择:

    将每组系数填充为 16 个值以保持对齐 对未对齐的访问使用 _mm256_loadu_ps 内在函数

第一种选择更节省速度,而第二种选择更节省空间。

【讨论】:

以上是关于阵列中的 AVX 对齐的主要内容,如果未能解决你的问题,请参考以下文章

AVX2 1GB 长阵列

两个 16 位整数向量与 C++ 中的 AVX2 的内积

SSE 向量重新对齐?

SSE / AVX 对齐内存上的 valarray

如何解决 AVX 加载/存储操作的 32 字节对齐问题?

在 GCC 上设置打包的 long long 的正确对齐以与 avx2 指令一起使用