AVX对齐数组

AVX alignment in array

本文关键字:数组 对齐 AVX      更新时间:2023-10-16

我使用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个浮点数,然后加载它,但是性能损失太高了。

你有两个选择:

  1. 将每组系数垫为16个值以保持对齐
  2. 使用_mm256_loadu_ps内禀对未对齐的访问