gprofile 中的 mkl_vml_serv_threader 意味着 MKL 不是 运行 顺序

does mkl_vml_serv_threader in the gprofile means MKL is not running sequentially

我们是 运行 正在增强 MKL BLAS 的应用程序。我们被告知不要使用超线程。

为了在编译期间不考虑多线程(所谓的并行?)版本,即禁用超线程但只想要 MKL 顺序矢量化,我们从 FindMKL Cmake 文件中删除了线程库。编译器是 icc 2019.

为了在运行时禁用多线程,我们在 slurm 文件中启动了 slurm 设置 --threads-per-core=1 中的任务。

但是我们不确定如何仔细检查 MKL 是否只是 运行 顺序,所以我们收集了一个(对 4 个核心,单个集群节点求和)配置文件 w/ gprof。

以下功能出现在平面配置文件中,尽管每个功能消耗不到 0.3%。它们是否支持 MKL 是超线程的观点,即“不是 运行 顺序模式”?

mkl_vml_serv_threader_d_2iI_1oI

mkl_vml_serv_threader_d_1i_1o

mkl_vml_serv_threader_d_1iI_1oI

mkl_vml_serv_threader_d_2i_1o

默认情况下,英特尔® oneAPI 数学核心函数库使用的 OpenMP 线程数等于系统上的物理内核数,并且它 运行 在所有可用的物理内核上使用,直到并且除非我们提到一些下面提到的选项。

像 icc(latest) 这样的 Intel 编译器有一个编译器选项 -qmkl=[lib] 并且 lib 指示应该 linked 哪些库文件,值如下。

parallel:

告诉编译器 link 使用 oneMKL 中的线程库。如果指定的选项没有库,则这是默认值。

sequential:

告诉编译器 link 使用 oneMKL 中的顺序库。

cluster:

告诉编译器 link 使用 cluster-specific 库和 oneMKL 中的顺序库。

因此,如果您想 运行 按顺序,请使用 -qmkl=sequential。 由于您使用的是 icc 2019,请检查 icc --help 并搜索选项(我猜是 -mkl 而不是 -qmkl)。

此外,您还可以使用 link 线路顾问工具 (https://www.intel.com/content/www/us/en/developer/tools/oneapi/onemkl-link-line-advisor.html?wapkw=link%20line%20advisor#gs.0myxfc),它可以帮助您查看特定于您的用例所需的库。

如评论中所述,使用 MKL_VERBOSE=1 有助于获取有关 MKL 版本的详细信息、mkl 调用的参数、函数占用的时间,以及指示线程数的 NThr 和一些其他细节也可以参考给定的link。 例如:MKL_VERBOSE=1 ./a.out