如何处理 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 时的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 MaxUploadSizeExceededException