Moh*_*esh 2 codeblocks intrinsics avx c++11
当我在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;
}
Run Code Online (Sandbox Code Playgroud)
问题是在C ++ 17之前,new并且delete不考虑要分配的类型的对齐方式。如果您通过此简单函数查看生成的程序集:
INFO* new_test() {
int _size = 100;
INFO *info = new INFO[_size];
return info;
}
Run Code Online (Sandbox Code Playgroud)
您会看到,使用C ++ 17之前的任何东西进行编译时operator new[](unsigned long)都会调用,而对于C ++ 17,则会进行调用operator new[](unsigned long, std::align_val_t)(并32传递给第二个参数)。
在Godbolt上玩耍。
如果您不能使用C ++ 17,可以覆盖operator new[](和operator delete[]-你应该覆盖operator new和operator 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
}
};
Run Code Online (Sandbox Code Playgroud)
如果您使用进行编译,则这是前面的Godbolt示例的一部分-DOVERWRITE_OPERATOR_NEW。
请注意,这在使用std::vector(或任何其他std-container)时不能解决对齐问题,因为您需要将对齐的分配器传递给容器(不属于先前示例)。
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |