質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

2回答

2467閲覧

rust ndarrayの行列演算をマルチスレッドで行いたい

BoKuToTuZenU

総合スコア51

CPU

CPUは、コンピュータの中心となる処理装置(プロセッサ)で中央処理装置とも呼ばれています。プログラム演算や数値計算、その他の演算ユニットをコントロール。スマホやPCによって内蔵されているCPUは異なりますが、処理性能が早いほど良いとされています。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

3クリップ

投稿2021/02/11 22:07

編集2021/02/11 22:12

やりたいこと

rust ndarrayを用いて線形代数や一般的な行列演算を高速に行いたいと思っています。高速に行いたいため、効率よくCPUのコアを使って欲しいと思っています。

やったこと

ndarrayndarray_linalgを用いて、行列演算を試験的逆行列を求めるコードかき、topコマンドでCPUの使用率をモニターしました。
使用したコードは以下です。

rust

1 2use ndarray::{Array2, Array}; 3use ndarray_linalg::InverseInto; 4use ndarray_rand::RandomExt; 5use ndarray_rand::rand_distr::Normal; 6 7fn main() { 8 let a = Array::random((100000,100000), Normal::new(1.,1.).unwrap()); 9 let inv_a = a.inv_into().unwrap(); 10}

結果

CPUの使用率をモニターしたところ100%に張り付いており1コアのみで演算を行っているようにおもいました。

調べたこと

ndarray_linalgのソースを読んで調べてみたのですが、逆行列を求めている該当の部分に関しては、ndarray-linalg/src/solve.rsの部分だと考えています。

impl<A, S> InverseInto for ArrayBase<S, Ix2> where A: Scalar + Lapack, S: DataMut<Elem = A> + RawDataClone, { type Output = Self; fn inv_into(self) -> Result<Self::Output> { let f = self.factorize_into()?; f.inv_into() } }

とあり、ScalarLapackinv_intoが実装されていると考えました。そこで、Scalarcauchyで実装されているもので、inv_intoが実装されていなさそうだとおもいました。
そのため、Lapackで逆行列を求めるinv_intoが実装されていると考えました。
Lapack/ndarray-linalg/lax/src/lib.rsに実装されておりました。そのため、inv_intoOperatorNorm_,
QR_,SVD_,SVDDC_,Solve_,Solveh_,Cholesky_,Eig_,Eigh_,Triangular_,Tridiagonal_,Rcond_,LeastSquaresSvdDivideConquer_のうちのどれかに実装されていそうだと考えました。結局、Solve_で実装されていると考えました。invの実装しか見つからなかったのでinv_intoの中身がどこにあるのかは結局よくわかりませんでした。

また、invの中身に関しても、Rust初心者なので理解できませんでした。
結局、なぜマルチスレッドで計算できないのかがよくわかりませんでした。

お答えいただきたいこと

intel_mklを用いて計算しているのであればマルチスレッドで計算されると考えておりました。
なぜマルチスレッドにならないか、どのようにすれば解決するのかを教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まだリリースしていない 0.13.0 (GitHub の master) ベースでの話になってしまって恐縮ですが,
ndarray-linalg から Intel MKL を呼び出す場合 intel-mkl feature を指定しますが、これは MKL の serial 実装 mkl-static-lp64-seq をリンクするため並列化されていません。MKL自体に並列実行させるためには mkl-static-lp64-iomp をリンクする必要がありますが、linalg 側にこれを指定するオプションは現在作っていないので Cargo.toml の [patch]intel-mkl-src crate 自体を置き換えるか、linalg 自体を変更するなら lax/Cargo.toml ここの seqiomp に変更すると動くはずです

投稿2021/02/13 07:24

termoshtt

総合スコア136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BoKuToTuZenU

2021/02/13 09:46

ご回答いただきありがとうございます。こちらをご教授いただいた方法でやってみようかとおもいます。 また、今後のリリースでintel-mklの設定を変更できるようなfeatureを加える予定はありますか?
guest

0

さわったことないからわからないですけど、
OMP_NUM_THREADS に値設定したらふえたりしないですかね?

https://jp.xlsoft.com/documents/intel/mkl/mac/Getting_Started_mac.htm

スレッド化 インテル MKL は、多くの個所でスレッド化されています。また、OpenMP* ソフトウェアを使用しています。 OpenMP ソフトウェアは、使用するスレッド数を設定する OMP_NUM_THREADS 環境変数を基にスレッド化を実行します。スレッド数は、プログラムを実行するシェルで設定することができます。 変数 OMP_NUM_THREADS が設定されていない場合、インテル MKL ソフトウェアはスレッド数を 1 として実行します。OMP_NUM_THREADS は、常にアプリケーションで使用するプロセッサー数に設定しておくことを推奨します。 1D FFT における 2 の累乗データについては、インテル MKL はインテル® Itanium® プロセッサー用にのみ並列化を行うことに注意してください。 スレッド数を変更するには、プログラムを実行するコマンドライン・シェルで次のように入力します。 export OMP_NUM_THREADS=<使用するスレッド数>

投稿2021/02/12 07:37

jksy

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BoKuToTuZenU

2021/02/12 07:55

ご回答いただき、ありがとうございます。export OMP_NUM_THREADS=12と設定して計算させてみましたが、1スレッドで計算を行っているようです。また、私がリポジトリにあるコードを読んだ感じではどこでintel mklやOpenblasなどのライブラリを読み出しているのかがわかりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問