gpt4 book ai didi

c++11 - 在使用 new[] 分配的数组上使用 avx 时出现段错误(核心转储)

转载 作者:行者123 更新时间:2023-12-02 23:37:26 24 4
gpt4 key购买 nike

当我在 Visual Studio 2015 中运行此代码时,代码工作正常。但代码在代码块中生成以下错误:段错误(核心转储)。我也在 ubuntu 中运行了代码,出现同样的错误。

#include <iostream>
#include <immintrin.h>

struct INFO
{
unsigned int id = 0;
__m256i temp[8];
};

int main()
{
std::cout<<"Start AVX..."<<std::endl;
int _size = 100;
INFO *info = new INFO[_size];
for (int i = 0; i<_size; i++)
{
for (int k = 0; k < 8; k++)
{
info[i].temp[k] = _mm256_setr_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31);

}
}
std::cout<<"End AVX."<<std::endl;
return 0;
}

最佳答案

问题在于 C++17 new 之前和delete不尊重要分配类型的对齐方式。如果您查看这个简单函数生成的程序集:

INFO* new_test() {
int _size = 100;
INFO *info = new INFO[_size];
return info;
}

当使用 C++17 之前的任何内容编译时,您会看到这一点 operator new[](unsigned long)被调用,而对于 C++17 则调用 operator new[](unsigned long, std::align_val_t) (并且 32 作为第二个参数传递)。 Play around with it at godbolt .

如果不能使用C++17,可以覆盖operator new[] (和 operator delete[] ——并且您还应该覆盖 operator newoperator delete ...):

struct INFO {
unsigned int id = 0;
__m256i temp[8];
void* operator new[](size_t size) {
// part of C11:
return aligned_alloc(alignof(INFO), size);
}
void operator delete[](void* addr) {
free(addr); // aligned_alloc is compatible with free
}
};

这是前面的 godbolt 示例的一部分,如果您使用 -DOVERWRITE_OPERATOR_NEW 进行编译.

请注意,这并不能解决使用 std::vector 时的对齐问题(或任何其他 std -容器),为此您需要将对齐的分配器传递给容器(不是上一个示例的一部分)。

关于c++11 - 在使用 new[] 分配的数组上使用 avx 时出现段错误(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55566275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com