C++ Valgrind非法指令AVX

C++ Valgrind非法指令AVX,c++,c,valgrind,C++,C,Valgrind,使用valgrind评估程序时,我收到一些错误。更准确地说,我得到的错误如下 vex amd64->IR:未处理的指令字节:0xC5 0xF8 0x28 0x0 0xC5 0xF8 0x29 0x45 ... ... 非法指令 我把这个问题归结为一个非常简单的例子 #include <immintrin.h> int main() { float f __attribute__((aligned(16))); // No need to be aligned f = 2.0f

使用valgrind评估程序时,我收到一些错误。更准确地说,我得到的错误如下

vex amd64->IR:未处理的指令字节:0xC5 0xF8 0x28 0x0 0xC5 0xF8 0x29 0x45 ... ... 非法指令

我把这个问题归结为一个非常简单的例子

#include <immintrin.h>
int main() {
  float f __attribute__((aligned(16))); // No need to be aligned
  f = 2.0f;
  __m128 a = _mm_broadcast_ss(&f);
  return 0;
}
#包括
int main(){
浮点f _u属性_u((对齐(16));//无需对齐
f=2.0f;
__m128 a=_mm_广播系统(&f);
返回0;
}
该程序是使用gcc和选项-mavx编译的。如果改用SSE2指令_mm_set1_ps,则会发生相同的错误,但仅在使用-mavx编译时才会发生。使用-msse2编译程序时,valgrind不会报告任何错误

我怀疑这是一个valgrind bug,但找不到关于x86的任何报告。我的机器是Core-i7 Sandy Bridge和valgrind版本3.7.0

如果有人有一个更好的替代valgrind的注册感知编程,我想知道


提前感谢

mm\u broadcast\u ss
转换为单个CPU指令,它需要。您可能需要更为最新的valgrind来支持该指令


有关说明,请参阅

您使用的是2011年11月发布的非常旧的valgrind 3.7.0。它不支持AVX/AVX2

3.8.0中增加了对AVX的支持,3.9.0中增加了对AVX2的支持。最新版本是2014年11月发布的3.10.1


除了Valgrind版本不是最新版本之外,虽然SSE需要16字节对齐,但AVX指令需要32字节对齐。你说得对,但是“mm”广播后面的指令不需要对齐正确的参数,我只是在做注释,以防代码其余部分的其他内容也对齐。AVX指令集还包括旧指令的新编码(
VEX/EVEX
-前缀),它可以通过避免部分寄存器写入来提高混合传统
SSE
和新
AVX
指令的性能。不幸的是,这意味着如果要使用
-mavx
,即使在使用
SSE
指令时,处理器(或模拟器,视情况而定)也必须支持这些。感谢链接。但有一点有趣的是,如果程序是用-mavx编译的,那么用SSE2指令替换该指令也会失败。程序集可能显示_mm_set1_ps被转换为AVX广播指令。我会更新valgrind@JensMunk:是否忽略了
-mavx
?对于32位编译可能会发生这种情况。或者也可能有其他选项强制使用内置函数。请参阅。刚刚检查了程序集输出,_mm_set1_ps在使用-mavx选项时转换为vbroadcastss指令。它解释了我看到的错误。