1

3x3行列の固有値と固有ベクトルを何百万回も見つける必要があるプログラムがあります。これにLAPACKのzheev(はい、エルミート行列です)を使用するように切り替えたところですが、特定のケースでは、プログラムは約1分20秒で実行されます。アルゴリズムをOpenMPと並列化したところ(以前と同じように)、突然プログラムが約9mで実行されました。zheevへの呼び出しをコメントアウトすると、プログラムは9秒で実行されます。

私はオンラインで調べて、OpenMPを使用するためにBLASライブラリをコンパイルできることを(私が理解しているように)見つけましたが、それがここでの問題ではないと思います。

残念ながら、このコードは私の仕事からのものです。デフォルトの場所にlapackがインストールされておらず、コンパイル時にどのコンパイラオプションが使用されたかわかりません。これはまた、問題を実証するための最小限のテストプログラムをコンパイルすることを困難にします。

問題が何であるかについてのアイデアはありますか?

編集:

私は、OpenMPでzheevが失敗していることを知りました。これは、おそらく実行速度が遅いことに関係しています。LAPACKの一部のルーチンがスレッドセーフではない(またはスレッドセーフなバリアントがある)ことを読みましたが、zheevがそれらのルーチンの1つを呼び出しているかどうかを確認するにはどうすればよいですか?それを変更できますか?

4

1 に答える 1

4

今のところOpenMPの問題は別として、コードがパフォーマンスに敏感な場合は、LAPACKを使用して3x3行列の固有値と固有ベクトルを見つけたくない場合があります。LAPACKは「大きな」問題を対象としています。さらに重要なことに、次元が5より小さい行列の特定のケースでは、固有値を直接計算できるため、一般的な行列(必然的に反復が必要)に使用されるよりも単純なアルゴリズムを使用できます。

3x3行列の特性多項式は、3次多項式であることを思い出してください。これは、その根(固有値)を直接計算できることを意味します。固有値がわかれば、固有値ラムダごとに(A --lambda * I)x = 0を直接解いて、対応する固有ベクトルを取得できます。

于 2012-04-13T14:52:00.027 に答える