我正在使用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
编译的。
`
答案 0 :(得分:2)
test
可以在32字节边界上对齐,但test[1]
(test + 1
)不是(因为50个8字节元素占用400字节)。这就是造成你的段错误的原因。