C AVX2:访问数组数组中的地址时SEG故障

C++ AVX2: Seg fault when accessing address within array of arrays

本文关键字:数组 地址 SEG 故障 AVX2 访问      更新时间:2023-10-16

我正在使用avx2指令在数组中的数组,一个名为 test的2D数组和一个称为 joined_pos的单独数组之间进行位和操作。这是我的代码:

#include <emmintrin.h>
#include <nmmintrin.h>
#include <chrono>
#include <iostream>
#include <immintrin.h>

#define ROUND_DOWN(x, s) ((x) & ~((s)-1))

int main()
{
    // Create two aligned arrays on a 32 byte boundary
    uint64_t test[10][50] __attribute__ ((aligned (32))) = {0};
    uint64_t join_pos[50]  __attribute__ ((aligned (32))) = {0};
        for(int i = 0; i < 10; i++){
        // get a pointer to the i-th aligned array in test
        uint64_t (*ptr1)[50] = test;
        ptr1 += i;
        // get a pointer to the first element in join_pos
        uint64_t *ptr2 = join_pos;
        // Cast ptr1 and ptr2 
            __m256i* ptr3 = (__m256i*) ptr1;
            __m256i* ptr4 = (__m256i*) ptr2;
        int counts = 0;
        int k = 0;
        for(; k < ROUND_DOWN(25,4); k+=4,ptr3++,ptr4++){
            __m256i val1 = _mm256_load_si256(ptr3); // This causes a segfault
            __m256i val2 = _mm256_load_si256(ptr4);
            __m256i val = _mm256_and_si256(val1, val2);
        }
    }
}

由于某种原因,当我尝试从2D数组test加载数据时,我会得到一个segfault。如果我使用加载非对齐内存的函数(_mm256_load_si256)加载数据,则代码运行,但我确实对齐test,因此从中加载应该可以工作。

注意:该代码是使用g++ -mavx2 -std=c++11 -g file.cpp -o file编译的。`

test可以在32个字节边界上对齐,但是 test[1]test + 1)不是(因为50个8字节元素占400个字节)。这就是导致您的segfault的原因。