如何处理 SIGSEGV,Segmentation fault。使用 Avx2 时

Posted

技术标签:

【中文标题】如何处理 SIGSEGV,Segmentation fault。使用 Avx2 时【英文标题】:How to deal with SIGSEGV, Segmentation fault. while using Avx2 【发布时间】:2020-12-07 06:28:04 【问题描述】:

如何处理SIGSEGV,Segmentation fault。使用 Avx2 时 (_mm256_load_pd)(_mm256_store_pd)

(已解决)

_mm256_load_pd

我收到了分段错误,称为

_mm256_load_pd

用处不大

double * Val = malloc(sizeof(double)*4);
__m256d vecv = _mm256_load_pd(&Val[0]);

gdb 展示

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7fc5017 in _mm256_load_pd (__P=0x555555559370)
    at /usr/lib/gcc/x86_64-linux-gnu/9/include/avxintrin.h:862
862   return *(__m256d *)__P;
(gdb) frame 1
#1  gemv_d_lineProduct_4_avx2 (Val=0x555555559370, indx=0x5555555592f0, 
    Vector_X=0x5555555592c0, Vector_Y=0x555555559340)
    at someThing.c:114
114     __m256d vecv = _mm256_load_pd(&Val[0]);
(gdb) 

_mm256_store_pd

当我让 Val 变大时

double * Val = malloc(sizeof(double)*4);

我发现 _mm256_load_pd 工作正常,但结果

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7fc50e3 in _mm256_store_pd (__A=..., __P=0x555555559390)
    at /usr/lib/gcc/x86_64-linux-gnu/9/include/avxintrin.h:868
868   *(__m256d *)__P = __A;
(gdb) frame 1
#1  gemv_d_lineProduct_4_avx2 (Val=0x5555555593e0, indx=0x555555559310, 
    Vector_X=0x5555555592c0, Vector_Y=0x555555559390)
    at something.c:122
122     _mm256_store_pd(Vector_Y,vecY);

完整项目

https://github.com/DevilInChina/gemv

mkdir build;cd build
cmake ..
make
cd ../bin
./line
#then might get some seg fault

解决方法

将内存分配函数改为

void *aligned_alloc (size_t __alignment, size_t __size);

第一个参数应该是 1024 或其他。

感谢igor-r

【问题讨论】:

可能是对齐问题?尝试使用aligned_alloc() 谢谢,我尝试了aligned_alloc(1024,xx) 并得到了正确的结果 Method of solving 请将其发布为答案。 【参考方案1】:

根据Intel reference,_mm256_load_pd()需要32字节对齐的指针。

请使用aligned_alloc() 分配具有正确对齐方式的内存块。

【讨论】:

或使用_mm256_loadu_pd(),它适用于未对齐的数据。

以上是关于如何处理 SIGSEGV,Segmentation fault。使用 Avx2 时的主要内容,如果未能解决你的问题,请参考以下文章

什么导致 SIGSEGV

Segmentation Fault

c# FileSystemWatcher如何处理多个文件?

如何处理 MaxUploadSizeExceededException

如何处理 UsernameNotFoundException 春季安全

如何处理c#中的错误代码