Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 阵列中的AVX对准_C++_C_Intrinsics_Avx - Fatal编程技术网

C++ 阵列中的AVX对准

C++ 阵列中的AVX对准,c++,c,intrinsics,avx,C++,C,Intrinsics,Avx,我正在使用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(

我正在使用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);

    ...
}
for(无符号i=0;i
有没有可能解决这个问题?我想保留我的数据结构,但如果不可能,我会更改它。我找到的一个解决方案是先在对齐的数组中复制8个浮点,然后加载,但性能损失太大了。

您有两个选择:

  • 将每组系数填充为16个值以保持对齐
  • 对于未对齐的访问,请使用
    \u mm256\u loadu\u ps
    内部命令

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

    我想你的意思是
    I=0
    I=1
    ,而不是
    n
    。至于对齐,您实际上只有几个选择:要么将结构填充到16个值以保持对齐,要么对未对齐的加载使用
    \u mm256\u loadu\u ps
    。非常感谢您的建议!我还没见过这个!代码是有效的(是的,我的意思是I,而不是n。好的,我会把它转换成一个答案。