C++ 阵列中的AVX对准
我正在使用MSVC12(Visual Studio 2013 Express),并尝试实现8*8浮点值的快速乘法。问题在于对齐:向量实际上有9*n个值,但我始终只需要前8个,因此,例如,对于n=0,保证32个字节的对齐(当我使用_mm_malloc时),对于n=1,“第一个”值在4*9=36个字节对齐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(
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个浮点,然后加载,但性能损失太大了。您有两个选择:
\u mm256\u loadu\u ps
内部命令第一种选择的速度效率更高,而第二种选择的空间效率更高。我想你的意思是
I=0
和I=1
,而不是n
。至于对齐,您实际上只有几个选择:要么将结构填充到16个值以保持对齐,要么对未对齐的加载使用\u mm256\u loadu\u ps
。非常感谢您的建议!我还没见过这个!代码是有效的(是的,我的意思是I
,而不是n
。好的,我会把它转换成一个答案。