从 AVX2 机器编译 AVX-512 代码失败

2021-04-06 11:45:06 +08:00
 xuegy

头节点是 Haswell (AVX2),计算节点是 Skylake (AVX-512),想把 C++代码优化为 AVX-512 指令集。

尝试了 gcc9,加了-march=skylake-avx512直接编不过去。

又试了 icc,加了'-axCORE-AVX512'能编译通过,一运行秒崩溃。

跟管理员一块调试了一整天,谁也不知道怎么回事。最后管理员告诉我说,某些情况下 AVX 指令如果不在本机编译可能会出错,让我试试去计算节点从本机编译。

这个东西感觉已经是玄学范畴了。如果从 AVX2 编译到 AVX-512 都能出错,那交叉编译 ARM 的还活不活了?

顺便说一句,AMD 的-march=znver2比某些普通且自信的玩意要 YES 多了...

2557 次点击
所在节点    程序员
7 条回复
matolv
2021-04-06 11:59:24 +08:00
“又试了 icc,加了'-axCORE-AVX512'能编译通过,一运行秒崩溃。”
Haswell 没有 avx512,你怎么运行得起来?除非你代码里面 fall back 到 avx2 或者 sse

跑分软件 cinebench r23 抛弃了 avx512,总体而言开启 avx512 以后导致的 cpu 降频+高能耗总体比 avx2 并不占优,skylake 构架落后不能光靠一个 simd 指令集翻身

另外 amd 已经有 Znver3 了,只是编译器还没完全适配完
参考: https://www.phoronix.com/scan.php?page=news_item&px=Znver3-GCC-10-Backport
xuegy
2021-04-06 12:06:13 +08:00
@matolv “计算节点是 Skylake (AVX-512)”
vk42
2021-04-06 12:07:37 +08:00
@matolv lz 应该是说在服务器上崩溃

不过话说这问题问的,编译错误信息没有,崩溃输出也没有……
xuegy
2021-04-06 12:22:41 +08:00
@vk42 gcc 压根就没报错误信息,直接不生成.o 然后退出了。

icc 编译出来的报个 SIGFPE,肯定是编译器的锅了。
whee1
2021-04-06 12:54:53 +08:00
@matolv #1 可能需要 libc 等依賴庫都是-march=skylake-avx512 才行。
連 funtoo 都沒有支持 avx512 的 subarch,不過可以使用 https://www.funtoo.org/Intel64-skylake 這個 stage3 編譯一個出來試試。實在不行就加-march=skylake-avx512 重新編譯一下 gcc glibc,總比自己 bootstrap 一套工具鏈簡單點。

換個編譯選項就崩潰的問題,我也遇到過。甚至有些程序即使是-s -g0 生成的,你把他 strip 一下就不行了。
coolmenu
2021-04-06 16:51:15 +08:00
用 intel 自己的编译器测试一下?
henices
2021-04-06 17:43:22 +08:00
-march=native 试试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/768314

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX