C ++ AVX2:访问数组数组中的地址时出现Seg错误

时间:2017-03-02 02:00:06

标签: c++ avx2

我正在使用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加载数据时,我得到了一个段错误。如果我使用加载未对齐内存(_mm256_load_si256)的函数加载数据,则代码会运行,但我确实对齐test,因此从它加载应该可以正常工作。

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

1 个答案:

答案 0 :(得分:2)

test可以在32字节边界上对齐,但test[1]test + 1)不是(因为50个8字节元素占用400字节)。这就是造成你的段错误的原因。