gpt4 book ai didi

c - Mac OSX 上的 vector 标量乘法 AVX 段错误

转载 作者:行者123 更新时间:2023-11-30 16:51:00 25 4
gpt4 key购买 nike

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

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是 vector 。函数void matsca(const double* a, double c, double *b)将被一次又一次地调用以对 double 进行操作步幅为 8 的大维度 vector 自 AVX可以拿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 %f\n", f[0], f[1], f[2], f[3]);
#endif

_mm256_storeu_pd(b, a2);
}

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

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;
}
}

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

关于c - Mac OSX 上的 vector 标量乘法 AVX 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41931776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com