インテルのMKLをRで使用し、MKL_NUM_THREADS変数を使用してスレッド数を調整しようとしています。
それは正しくロードされ、htopで3200%のCPUを使用してそれを見ることができます。ただし、実際には1つのスレッドのみを使用するよりも高速ではありません。
私はCentOSに Dirk Eddelbuettelのガイド を採用していますが、どこかでフラグや設定を見逃している可能性があります。
これは、スレッド数がジョブ時間にどのように関連するかをテストしている方法の簡略版です。 OpenBlasを使用すると、期待どおりの結果が得られます。
require(callr)
#> Loading required package: callr
f <- function(i) r(function() crossprod(matrix(1:1e9, ncol=1000))[1],
env=c(rcmd_safe_env(),
R_LD_LIBRARY_PATH=MKL_R_LD_LIBRARY_PATH,
MKL_NUM_THREADS=as.character(i),
OMP_NUM_THREADS="1")
)
system.time(f(1))
#> user system elapsed
#> 14.675 2.945 17.789
system.time(f(4))
#> user system elapsed
#> 54.528 2.920 19.598
system.time(f(8))
#> user system elapsed
#> 115.628 3.181 20.364
system.time(f(32))
#> user system elapsed
#> 787.188 7.249 36.388
reprexパッケージ (v0.3.0)により2020-05-13に作成
編集5/18
MKL_VERBOSE = 1を試すという提案に従って、stdoutに次のように表示され、lapackを正しく呼び出していることがわかります。
MKL_VERBOSE Intel(R) MKL 2020.0 Product build 20191122 for Intel(R) 64 architecture Intel(R) Advanced Vector Extensions 512 (Intel(R) AVX-512) with support of Vector Neural Network Instructions enabled processors, Lnx 2.50GHz lp64 intel_thread
MKL_VERBOSE DSYRK(U,T,1000,1000000,0x7fff436222c0,0x7f71024ef040,1000000,0x7fff436222d0,0x7f7101d4d040,1000) 10.64s CNR:OFF Dyn:1 FastMM:1 TID:0 NThr:1
f(8)の場合、NThr:8を示します
MKL_VERBOSE Intel(R) MKL 2020.0 Product build 20191122 for Intel(R) 64 architecture Intel(R) Advanced Vector Extensions 512 (Intel(R) AVX-512) with support of Vector Neural Network Instructions enabled processors, Lnx 2.50GHz lp64 intel_thread
MKL_VERBOSE DSYRK(U,T,1000,1000000,0x7ffe6b39ab40,0x7f4bb52eb040,1000000,0x7ffe6b39ab50,0x7f4bb4b49040,1000) 11.98s CNR:OFF Dyn:1 FastMM:1 TID:0 NThr:8
コアを追加しても、期待されるパフォーマンスの向上は得られません。
編集2
MicrosoftのMKLのディストリビューションを使用して期待どおりの結果を得ることができますが、ウォークスルーのようにIntelの公式のディストリビューションではできません。 MSがGNUスレッドライブラリを使用しているようです。問題はスレッドライブラリにあり、blas/lapack自体にあるのではないでしょうか?
RがMKLを呼び出す方法は正確にはわかりませんが、crossprod関数がその下でmklのgemmを呼び出す場合、そのような入力で非常に優れたスケーラビリティの結果を確認する必要があります。入力問題のサイズは何ですか? MKLは詳細モードをサポートしています。このオプションは、dgemmが実行されるときに、多くの有用なランタイム情報を確認するのに役立ちます。 MKL_VERBOSE = 1環境をエクスポートしてログファイルを確認してみませんか?ただし、Rが出力を抑制しないかどうかは、私にはよくわかりません。