【发布时间】:2019-11-06 19:33:09
【问题描述】:
我正在尝试运行类似于以下的代码
#include <immintrin.h>
void foo() {
__m128i a = _mm_set_epi8 (0,0,6,5,4,3,2,1,8,7,6,5,4,3,2,1);
__m128i b = _mm_set_epi8 (0,0,0,0,0,0,0,1,8,7,6,5,4,3,2,1);
__mmask16 m = _mm_cmpeq_epi8_mask(a,b); // supposedly requires avx512vl and avx512bw
std::cout<<m<<std::endl;
}
void bar() {
int dataa[8] = {1,0,1,0,1,0,1,0};
__m256i points = _mm256_lddqu_si256((__m256i *)&dataa[0]); // requires just mavx
(void)points;
}
但是,我一直遇到错误Illegal instruction (core dumped)
我用
编译代码g++ -std=c++11 -march=broadwell -mavx -mavx512vl -mavx512bw tests.cpp
根据 Intel 的内部文档,这些标志应该足以同时运行 foo 和 bar。但是,当 foo 或 bar 运行时,我会收到相同的错误消息。
但是,如果我删除foo,并在没有-mavx512vl 的情况下编译,我可以顺利运行bar。
我已经检查过我的 CPU 支持 mno-avx512vl 和 mno-avx512bw 标志,所以它应该支持 mavx512vl 和 mavx512bw 对吧?
我必须包含哪些标志才能运行这两个函数?还是我错过了什么?
【问题讨论】:
标签: gcc intrinsics instruction-set compiler-flags avx512