xmake icon indicating copy to clipboard operation
xmake copied to clipboard

mkl link issue

Open xq114 opened this issue 4 years ago • 10 comments

注:如果是问题报障或者特性请求,请选择报告缺陷特性请求模板,否则一律不回复。

描述讨论详情

现在mkl链接时报错

libmkl_core.a(_avx_z__trmm_rut.o): in function `mkl_blas_avx_ztrmm_rut':
_trmm_rut.f:(.text+0xd603): undefined reference to `mkl_blas_zaxpy'

原因是package里面链接是按顺序链接:

-lmkl_lapack95_ilp64 -lmkl_blas95_ilp64 -lmkl_intel_ilp64 -lmkl_tbb_thread -lmkl_core -ltbb -ltbbmalloc

但mkl有循环依赖,MKL Link Line Advisor要求必须用group链接:

-lmkl_blas95_ilp64 -lmkl_lapack95_ilp64 -Wl,--start-group ${MKLROOT}/lib/intel64/libmkl_intel_ilp64.a ${MKLROOT}/lib/intel64/libmkl_tbb_thread.a ${MKLROOT}/lib/intel64/libmkl_core.a -Wl,--end-group -ltbb -ltbbmalloc

所以需要等package也支持group linking ( https://github.com/xmake-io/xmake/issues/1452 ),还是有别的办法?

xq114 avatar Aug 11 '21 08:08 xq114

要么等那个特性完成,但目前不保证具体时间点,短期内不一定支持

要么自己 add_ldflags() 外面走 group link 搞下

waruqi avatar Aug 11 '21 08:08 waruqi

add_ldflags()实测不行,报错

warning: add_ldflags("-Wl,--start-group -lmkl_intel_lp64 -lmkl_tbb_thread -lmkl_core -Wl,--end-group") is ignored, please pass `{force = true}` or call `set_policy("check.auto_ignore_flags", false)` if you want to set it.

用了package:add("ldflags", "..", {force = true})但不起作用

xq114 avatar Aug 11 '21 08:08 xq114

{force = true} 是给 add_ldflags 的,根据提示操作

waruqi avatar Aug 11 '21 08:08 waruqi

{force = true} 是给 add_ldflags 的,根据提示操作

flags需要根据config拼凑,因此没法用add_ldflags代替。不过package:add("ldflags")add_ldflags行为应该一样才对啊

xq114 avatar Aug 11 '21 08:08 xq114

package:add 都不一定支持 ldflags。。目前应该仅对抽象的 defines/lindkdirs 做了支持

waruqi avatar Aug 11 '21 08:08 waruqi

package里面的group link功能能不能优先实现一下?完整的link顺序支持确实太过复杂,但只是group link不是很复杂;现在需要group link的package有一些( https://github.com/xmake-io/xmake/issues/2012 ),尤其是mkl,现在xmake-repo中很多库需要用blas都是暂时切到openblas了,而更稳定效果更好的mkl因为xmake不支持group link而用不了,这个限制挺大的

xq114 avatar Jul 01 '22 09:07 xq114

包里直接走 add_ldflags 呢,也可以加 group

waruqi avatar Jul 01 '22 09:07 waruqi

包里直接走 add_ldflags 呢,也可以加 group

这个之前是不行的,上面有讨论,现在这块有修改吗

xq114 avatar Jul 01 '22 11:07 xq114

add_ldflags 刚测了下,原本是完全支持的,只不过默认开了 check flags,检测失败就忽略了。。

warning: add_ldflags("-Wl,--start-group -lmkl_intel_lp64 -lmkl_tbb_thread -lmkl_core -Wl,--end-group") is ignored, please pass {force = true} or call set_policy("check.auto_ignore_flags", false) if you want to set it.

而你之前那个 ldflags ,因为里面缺少 -L,单独检测,就失败了。。

而 package 里面 {force = true} 暂时不支持,所以只要 ldflags 检测失败,就永远无法加上了。。

我刚 dev 改了下,对 add_ldflags/add_shflags 默认改为 force 模式了,可以完全加上,但是你配置时候,得判断下 gcc/clang 分别处理,mac clang下得用 -Xlinker

waruqi avatar Jul 01 '22 14:07 waruqi

至于 linkgroup ,我接口还没设计好,要支持,至少要得跟 target 层接口保持一致,还得考虑后期 add_links 的顺序调整啥的,目前有点乱,等确定好了再说。

waruqi avatar Jul 01 '22 14:07 waruqi