C AVX2:访问数组数组中的地址时SEG故障
C++ AVX2: Seg fault when accessing address within array of arrays
我正在使用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的原因。
相关文章:
- 将数组的地址分配给变量并删除
- 从 C++ 中的函数返回数组地址问题
- 打印字符数组地址的正确方法
- 字符数组地址和整数数组地址
- C++返回静态数组地址的函数
- C++ 在 64 位平台中传递字符数组地址
- 获取字符数组地址,然后转换为指针字符
- 如何指向实际元素而不仅仅是数组地址
- 如何使用数组地址反转数组
- 链表数组 – 地址簿
- 数组地址的地址
- 缺少存储数组地址的内存
- 将指针数组地址传递给函数并更新地址中的数据
- 通过复制将数组地址传递给匿名函数失败
- 数组地址不可见
- 不了解示例中的行为 - strcpy() 和返回本地数组地址的函数
- 保存数组地址的指针的地址是相同的
- 动态数组地址
- 在C++(代码块)中显示数组地址
- C++ 将数组地址分配给指针