使用SIMD intrinsics对8位整数求和时出现Illegal Instruction Error问题
问题根本原因
你触发Illegal instruction错误的核心原因是:你为仅支持AVX2指令集的i7-9750H CPU,编译了包含AVX512指令的二进制程序。此前逻辑相近的函数能正常运行只是巧合,编译器没有为这些函数生成实际的AVX512指令;到当前计算节点时,编译器基于你给定的AVX512编译参数生成了CPU不支持的指令,直接触发报错。
细节解释
1. 为什么同一个_mm256_add_epi8 intrinsic之前用不报错,此处报错?
_mm256_add_epi8这个向量加法内置函数,在你添加了-mavx512bw -mavx512vl编译参数的前提下,Intel dpcpp编译器可以选择将其编译为两种指令:
- AVX2指令集下的
vpaddb ymm, ymm, ymm(VEX编码):你的CPU支持 - AVX512指令集下的
vpaddb ymm, ymm, ymm(EVEX编码):i7-9750H属于第9代酷睿Coffee Lake架构,完全不支持AVX512指令集,无法识别该指令
此前的调用点编译器基于优化逻辑刚好生成了AVX2版本的指令,因此可以正常运行;到报错的这一行,编译器选择生成了EVEX编码的AVX512版本指令,就会触发非法指令错误。
2. 为什么编译器要求添加AVX512编译参数?
你同时使用了SYCL编译选项-fsycl -fsycl-targets=spir64,如果你的SYCL代码中用到了依赖AVX512的宿主端向量化优化或内置函数,编译器会提示你添加对应参数。但这个要求的前提是运行程序的目标CPU支持AVX512,在硬件不支持的场景下强制添加参数本身就存在运行风险。
解决方案
你可以二选一解决问题:
- 如果不需要在宿主端运行AVX512代码,直接将编译参数中的
-mavx512vl -mavx512bw -mavx512f替换为-mavx2 -mfma,完全适配你的i7-9750H硬件,即可解决报错。 - 如果确实需要保留AVX512编译参数用于其他代码逻辑,给
dxy_SIMD函数单独指定指令集属性即可:在函数声明前添加__attribute__((target("avx2"))),强制编译器为该函数生成AVX2指令,不会生成不兼容的AVX512指令。
内容的提问来源于stack exchange,提问作者ad99
相关产品推荐
相关产品推荐

