c++ - 数组中的 AVX 对齐

标签 c++ c intrinsics avx

我正在使用 MSVC12 (Visual Studio 2013 Express) 并尝试实现 8*8 浮点值的快速乘法。问题是对齐: vector 实际上有 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 个 float 复制到一个对齐的数组中,然后加载它,但是这样性能损失太高了。

最佳答案

你有两个选择:

  1. 将每组系数填充为 16 个值以保持对齐
  2. 使用 _mm256_loadu_ps 内部函数进行未对齐访问

第一个选择速度效率更高,而第二个选择空间效率更高。

关于c++ - 数组中的 AVX 对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25017052/

相关文章:

c++ - 对于给定的n个数字序列,尽可能以最低的计算复杂度找到总和最大的子串

c++ - 当我从 cin 读取时,为什么转义字符不起作用?

c - 为什么 readdir 在第一次调用目录后下次调用 readdir 时返回 null 和 I/O 错误

c++ - 如何仅使用 SSE2 对 double/int 进行 floor/int?

c - 如何使用编译器内部 __fmul_?

c++ - 交战 : Unused variable: rider ( Gmake, g++,freebsd)

c++ - 为什么我获得未分配内存的读写权限?

c - 在 C 中使用 fwrite 将存储在结构中的整数写入 .txt 文件,但是当我打开 .txt 文件时数字显示为框

c - 在 C 中,main() 应该有多大?

c++ - "__rotatel4"的名称查找未找到声明