Intel MKL 多线程设置
對(duì)于多核程序,多線(xiàn)程對(duì)于程序的性能至關(guān)重要。 下面,我們將對(duì)Intel MKL 有關(guān)多線(xiàn)程方面的設(shè)置做一些介紹:
我們提到MKL 支持多線(xiàn)程,它包括的兩個(gè)概念:
1>MKL 是線(xiàn)程安全的: MKL在設(shè)計(jì)時(shí),就保證它是一個(gè)線(xiàn)程安全的庫(kù)函數(shù)。 也就是說(shuō),無(wú)論是在單個(gè)線(xiàn)程中調(diào)用MKL函數(shù),還是在多個(gè)線(xiàn)程中同時(shí)使用Intel MKL 函數(shù),都能夠確保函數(shù)有正確的計(jì)算結(jié)果。
2>MKL函數(shù)內(nèi)部實(shí)現(xiàn)了多線(xiàn)程優(yōu)化。許多MKL的函數(shù),已經(jīng)包括內(nèi)部多線(xiàn)程的實(shí)現(xiàn)。用戶(hù)調(diào)這些函數(shù)時(shí),只需設(shè)置多線(xiàn)程的數(shù)目,MKL 函數(shù)的內(nèi)部,就可以同時(shí)進(jìn)行多個(gè)線(xiàn)程的并行計(jì)算。 Intel MKL 還提供了一個(gè)單線(xiàn)程版本的庫(kù)函數(shù),這個(gè)版本中,每個(gè)函數(shù)只運(yùn)行串行代碼。 我們需要在鏈接的時(shí)候,需要選擇鏈接串行(單線(xiàn)程)的MKL函數(shù),還是并行(多線(xiàn)程)的MKL 的函數(shù)。 下面我們提到的多線(xiàn)控制的方法,主要是針對(duì)的并行的MKL函數(shù)庫(kù)。
那么,在MKL 的多線(xiàn)程庫(kù)中, 如何設(shè)置MKL 多線(xiàn)程的數(shù)目呢? Intel MKL 使用了OpenMP實(shí)現(xiàn)了多線(xiàn)程,所以O(shè)penMP的環(huán)境變量與API對(duì)MKL 的多線(xiàn)程設(shè)置仍然有效。 除了OpenMP的方法外,MKL還提供了,其它的設(shè)置多線(xiàn)程的環(huán)境變量與API:
| 環(huán)境變量 | 對(duì)應(yīng)的API | 說(shuō)明 | 對(duì)于的OMP的變量 |
| MKL_NUM_THREADS | mkl_set_num_threads | 建議MKL 函數(shù)使用的多線(xiàn)程的數(shù)目。. | OMP_NUM_THREADS |
| OMP_NUM_THREADS | omp_set_num_threads | OpenMP提供的多線(xiàn)程設(shè)置的環(huán)境變量與API. | ? |
| MKL_DYNAMIC | mkl_set_dynamic | 建議MKL根據(jù)計(jì)算問(wèn)題,自動(dòng)設(shè)置多線(xiàn)程的數(shù)目,線(xiàn)程數(shù)目不超過(guò)用戶(hù)設(shè)定的線(xiàn)程的上限 | OMP_DYNAMIC |
需要說(shuō)明的是,Intel MKL 提供的多線(xiàn)程設(shè)置的方法,優(yōu)先級(jí)要高于OpenMP的方法。 比程序中,同時(shí)設(shè)置了下面的環(huán)境變量:
>export MKL_NUM_THREADS =1
>export OMP_NUM_THREADS =4
此時(shí),程序中,MKL的函數(shù)將會(huì)運(yùn)行一個(gè)線(xiàn)程。
關(guān)于多線(xiàn)程的設(shè)置,我們還需要注意下面的3個(gè)問(wèn)題:
第一,在超線(xiàn)程的機(jī)器上,Intel MKL 多線(xiàn)程的設(shè)置: 在系統(tǒng)中,當(dāng)多個(gè)線(xiàn)程的執(zhí)行不同的操作,CPU有空閑資源時(shí),多線(xiàn)程技術(shù)有較好的執(zhí)行效果。Intel MKL的計(jì)算核心已經(jīng)經(jīng)過(guò)充分優(yōu)化,并且這些計(jì)算的核心都執(zhí)行類(lèi)似的計(jì)算操作,所有多線(xiàn)程的設(shè)置,對(duì)于MKL 不能提供很好的幫助。 如果在程序執(zhí)行的機(jī)器上, 超線(xiàn)程的設(shè)置已經(jīng)打開(kāi), 一個(gè)推薦的做法是,設(shè)置MKL 的線(xiàn)程為系統(tǒng)核的數(shù)目(邏輯處理器數(shù)目的一半),并設(shè)置下面的threading affinity 的環(huán)境變量:
KMP_AFFINITY=granularity=fine,compact,1,0.
第二,MKL_DYNAMIC 環(huán)境變量: 這個(gè)環(huán)境變量確定是否由Intel MKL 來(lái)選擇計(jì)算的線(xiàn)程的數(shù)目, 但是總的線(xiàn)程數(shù)不會(huì)超過(guò)MKL_NUM_THREADS與OMP_NUM_THREADS的值。 Intel MKL會(huì)根據(jù)實(shí)際計(jì)算問(wèn)題的大小,以及多線(xiàn)程對(duì)計(jì)算是否有效等諸多情況,選擇適合的線(xiàn)程數(shù)目,這也是缺省的Intel MKL 多線(xiàn)程設(shè)置方式。
如果用戶(hù)手動(dòng)設(shè)置MKL_DYNAMIC=FALSE, Intel MKL 將根據(jù)用戶(hù)指定的線(xiàn)程數(shù)目,設(shè)置計(jì)算線(xiàn)程。 比如,設(shè)置:
MKL_DYNAMIC=FALSE
MKL_NUM_THREADS=6
MKL函數(shù)將運(yùn)行6個(gè)計(jì)算線(xiàn)程,盡管對(duì)某些小的計(jì)算問(wèn)題,6個(gè)線(xiàn)程可能并不是最有效的。
第三,并不是所有MKL函數(shù)都是多線(xiàn)程。 某些計(jì)算函數(shù),多線(xiàn)程并不能給程序帶來(lái)性能提升,如Level 1 BLAS,其主要計(jì)算瓶頸是數(shù)據(jù)訪(fǎng)問(wèn),這樣的函數(shù),內(nèi)部多線(xiàn)程,不能帶來(lái)很大幫助。 具體的MKL 多線(xiàn)程的函數(shù)列表, 可以查看用戶(hù)手冊(cè)。
有關(guān)多線(xiàn)程這方面的,進(jìn)一步的參考文檔:
MKL 用戶(hù)手冊(cè):http://software.intel.com/sites/products/documentation/hpc/mkl/mkl_userguide_lnx/index.htm
相關(guān)文章:
http://software.intel.com/en-us/forums/showthread.php?t=67622
http://software.intel.com/en-us/articles/intel-math-kernel-library-intel-mkl-intel-mkl-100-threading/
http://software.intel.com/en-us/articles/setting-thread-affinity-on-smt-or-ht-enabled-systems/
總結(jié)
以上是生活随笔為你收集整理的Intel MKL 多线程设置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 职场:人生从没有最佳时机!一个离职客服人
- 下一篇: c++调用dll动态链接库历程