linux系统下编译出错Error: suffix or operands invalid for `vbroadcastss’解决办法
在运行kaggle-2014-criteo-master 开源程序时,由于需编译运行gbdt,libffm程序,makefile时遇到错误,直觉与运行程序的系统有关系。经搜索找到了解决办法。
问题主要是gcc或g++编译时设置了 - march参数,而此参数为平台相关的参数。需要修改此参数值为机器对应的值。
(程序下载地址:https://github.com/ycjuan/kaggle-2014-criteo)
针对这个开源程序只需修改:
[文件路径]/kaggle-2014-criteo/solvers/gbdt 下的Makefile 的
[文件路径]/kaggle-2014-criteo/solvers/libffm-1.13 下的Makefile
-march=native 为-march=broadwel
之后再makefile 错误消失。
报错场景
具体报下面的错:
[dhy@Master kaggle-2014-criteo-master]$ make
make -C solvers/gbdt
make[1]: Entering directory `/home/dhy/code/kaggle-2014-criteo-master/solvers/gbdt'
g++ -Wall -Wconversion -O2 -fPIC -std=c++0x -march=native -fopenmp -o gbdt src/train.cpp src/common.cpp src/timer.cpp src/gbdt.cpp
make[1]: Leaving directory `/home/dhy/code/kaggle-2014-criteo-master/solvers/gbdt'
ln -sf solvers/gbdt/gbdt
make -C solvers/libffm-1.13
make[1]: Entering directory `/home/dhy/code/kaggle-2014-criteo-master/solvers/libffm-1.13'
g++ -Wall -O3 -std=c++0x -march=native -fopenmp -DUSEOMP -c -o ffm.o ffm.cpp
/tmp/ccuUtD2f.s: Assembler messages:
/tmp/ccuUtD2f.s:3671: Error: suffix or operands invalid for `vbroadcastss'
/tmp/ccuUtD2f.s:3787: Error: suffix or operands invalid for `vbroadcastss'
/tmp/ccuUtD2f.s:3917: Error: suffix or operands invalid for `vbroadcastss'
/tmp/ccuUtD2f.s:4071: Error: suffix or operands invalid for `vbroadcastss'
make[1]: *** [ffm.o] Error 1
make[1]: Leaving directory `/home/dhy/code/kaggle-2014-criteo-master/solvers/libffm-1.13'
make: *** [ffm-train] Error 2
解决办法
修改Makefile中,-march=native为-march=broadwell
这是因为gcc/g++ 参数march在不同架构的平台对应不同的-march选项,具体参考:https://gcc.gnu.org/onlinedocs/gcc 中“3.18 Machine-Dependent Options“”小节。查看机器对应的-march的方法为运行下面的命令1:
$gcc -c -Q -march=native --help=target | grep march
本人机子上执行上面的命令出现:
-march= broadwell
因此,在编译文件Makefile中 g++或gcc 参数设置为 -march= broadwell。
不同cpu对应march选择可参考下表:2
CPU类型 | march选项 |
---|---|
AMD Barcelona | - march=barcelona |
AMD Bobcat | - march=btver1 |
AMD Jaguar | - march=btver2 |
AMD Bulldozer | - march=bdver1 |
AMD Piledriver | - march=bdver2 |
AMD Steamroller | - march=bdver3 |
Intel Westmere | - march=westmere |
Intel Core Nehalem | - march=corei7 |
Intel Core Sandy Bridge | - march=corei7-avx |
Intel Core Ivy Bridge | - march=core-avx-i |
Intel Core Haswell | - march=core-avx2 |
Intel Core Broadwell | - march=broadwell |
Intel Atom Bonnell | - march=bonnell |
Intel Atom Silvermont | - march=silvermont |