C avx程序(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

这实际上是我的讲师提供的一个程序,用于比较avx方法与传统矩阵计算方法的效率。我能够在Macbook air 2015 13'中很好地运行这个程序。但是,我无法在manjaro linux中运行此程序,因为它将弹出此错误:

~/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字节对齐的内存。