C avx程序(Linux)上的分段故障(内核转储)
这实际上是我的讲师提供的一个程序,用于比较avx方法与传统矩阵计算方法的效率。我能够在Macbook air 2015 13'中很好地运行这个程序。但是,我无法在manjaro linux中运行此程序,因为它将弹出此错误:C avx程序(Linux)上的分段故障(内核转储),c,avx,C,Avx,这实际上是我的讲师提供的一个程序,用于比较avx方法与传统矩阵计算方法的效率。我能够在Macbook air 2015 13'中很好地运行这个程序。但是,我无法在manjaro linux中运行此程序,因为它将弹出此错误: ~/Documents >>> gcc -O3 -mavx dgemm_avx.c -o dgemm_avx ~/Documents >>> ./dgemm_avx Enter the matrix width: 10
~/Documents >>> gcc -O3 -mavx dgemm_avx.c -o dgemm_avx
~/Documents >>> ./dgemm_avx
Enter the matrix width: 1024
zsh: segmentation fault (core dumped) ./dgemm_avx
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <string.h>
#include <immintrin.h>
void dgemm_avx(int n, double *A, double *B, double *C)
{
int i, j, k;
for (i = 0; i < n; i++)
for (j = 0; j < n; j += 4)
{
__m256d c0 = _mm256_load_pd(C + i * n + j);
for (k = 0; k < n; k++)
{
__m256d vA = _mm256_broadcast_sd(A + k + i * n);
__m256d vB = _mm256_load_pd(B + j + k * n);
__m256d vC = _mm256_mul_pd(vA, vB);
c0 = _mm256_add_pd(c0, vC);
}
_mm256_store_pd(C + j + i * n, c0);
}
}
void initialize(int n, double *X)
{
int i;
for (i = 0; i < n * n; i++)
X[i] = (double)rand() / (double)RAND_MAX;
}
int main()
{
int n;
printf("Enter the matrix width: ");
scanf("%d", &n);
double *A = (double *)malloc(n * n * sizeof(double));
double *B = (double *)malloc(n * n * sizeof(double));
double *C = (double *)malloc(n * n * sizeof(double));
srand(1);
initialize(n, A);
initialize(n, B);
memset(C, 0, n * n * sizeof(double));
struct timeval st, et;
gettimeofday(&st, NULL);
dgemm_avx(n, A, B, C);
gettimeofday(&et, NULL);
float elapsed = ((float)(et.tv_sec - st.tv_sec)) + (float)(et.tv_usec - st.tv_usec) * 0.000001f;
printf("Calculation time for %d x %d matrix: %0.6f seconds\n", n, n, elapsed);
return 0;
}
#包括
#包括
#包括
#包括
#包括
无效dgemm_avx(整数n,双*A,双*B,双*C)
{
int i,j,k;
对于(i=0;i
提前谢谢。我可以确认Crashmaloc没有提供32字节对齐内存。如果编译时未进行优化,则会得到需要对齐的实际
vmovaps
(因为使用了\u mm256\u load\u pd
),而不是折叠到vmulps
的内存源中的加载。还为c0
负载提供了一个vmovaps。我假设你在Mac上碰巧得到了32字节对齐的内存。我可以确认crashmalloc没有给你32字节对齐的内存。如果编译时未进行优化,则会得到需要对齐的实际vmovaps
(因为使用了\u mm256\u load\u pd
),而不是折叠到vmulps
的内存源中的加载。还为c0
负载提供了一个vmovaps。我假设你在Mac上碰巧得到了32字节对齐的内存。