c语言 - Mac OSX 上的矢量标量乘法 AVX 分段错误



嗨,我正在尝试在 Sandy Bridge 处理器i7-3720QM (~2012)上使用AVX编写矢量标量乘法的代码。 该代码是使用GNU gcconMac OSX 10.8编译的C代码。

gcc -mavx -Wa,-q -o bb5 code1.c -lm

我越来越Segmentation fault: 11.请帮忙。

输出:

3.000000 6.000000 9.000000 12.000000 
Segmentation fault: 11

所以,看起来store命令无法正常工作?谢谢。最终我想做一些类似的事情A = A + x*B其中x是标量,AB是矢量。函数void matsca(const double* a, double c, double *b)将被一次又一次地调用以在大维度的double向量上运行,步幅为8AVX因为它可以4双元素(256 bits)。感谢您的帮助。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <immintrin.h>
void matsca(const double* a, double c, double *b)
{
__m256d a0 = _mm256_loadu_pd(a+0);
__m256d a1 = _mm256_set1_pd(c);
__m256d a2 = _mm256_mul_pd(a0,a1);
double* f = (double*)&a2;
printf("%f %f %f %f n",f[0],f[1],f[2],f[3]);
_mm256_store_pd(b,a2);
}
int main()
{
double m1[11]={1,2,3,4,5,6,7,8,9,10,11};
double *m3;
double m2=3;
int i;
matsca(&m1[0],m2,&m3[0]);
for (i=0; i<3; i=i+1)
{
printf("%d %f n",i,m3[i]);
}
return 0;
}

这是原始matsca的修复/改进版本:

inline void matsca(const double *a, const double c, double *b)
{
__m256d a0 = _mm256_loadu_pd(a);
__m256d a1 = _mm256_set1_pd(c);
__m256d a2 = _mm256_mul_pd(a0, a1);
#if DEBUG > 0
double *f = (double *)&a2;
printf("%f %f %f %fn", f[0], f[1], f[2], f[3]);
#endif
_mm256_storeu_pd(b, a2);
}

但是,您可能需要考虑将其更通用,以便它可以处理任何大小的向量,例如

inline void matsca(const double *a, const double c, double *b, const size_t n)
{
const __m256d a1 = _mm256_set1_pd(c);
size_t i;
for (i = 0; i + 4 <= n; i += 4)
{
__m256d a0 = _mm256_loadu_pd(&a[i]);
__m256d a2 = _mm256_mul_pd(a0, a1);
_mm256_storeu_pd(b, &a2[i]);
}
for ( ; i < n; ++i) // handle any odd elements at end of vector
{
a2[i] = a1[i] * a2;
}
}

通过这种方式,您可以分摊函数调用、初始化常量向量等的成本。

最新更新