こういう場合はmkl-service パッケージを使う
> conda install -c anaconda mkl-service
として、各コアに分散する関数の最初のほうに
import mkl
mkl.set_num_threads(1)
として、mklに最小のスレッド数を1にせよと指令を出すと1コア内で完結するようになる。
さらに問題なのは、AMDのRyzen 9 3900xを積んだPCでWindows用Anaconda+numpyを利用するときである。PCを買ってから気づいたのだけど、Ryzen 9はIntelが開発しているMKLと大変相性が悪い。開発中のmfapyはnloptをソルバとして用いているので、
1.下記のように仮想環境mfapyを作成する。
> conda create -n mfapy -c conda-forge nlopt numpy scipy matplotlib
(現在python 3.8.0がインストールされます)
2.この記事を参考にmklの機能を止める
> conda install mkl -c intel --no-update-deps
さらに環境変数MKL_DEBUG_CPU_TYPEを設定する。
MKL_DEBUG_CPU_TYPE=5
3.mkl-serviceモジュールを使用できるようにする。
> conda install -c anaconda mkl-service
こうすると、上記のmkl.set_num_threads(1)を設定することで、演算タスクを
1コア内に完結できるようになる。
どうもRyzen上でも、mkl-serviceによるスレッド数制御は可能らしい。
一方、インテルcpuに特有の命令は2)の操作で殺すことができているようだ。
0 件のコメント:
コメントを投稿