マルチプロセスおよびマルチスレッドによる高速化のサポート
このページでは、qiskit-addon-sqd がマルチスレッドおよびマルチプロセスによる高速化をどの程度サポートしているか、また、高性能計算 (HPC) の開発者がこのパッケージを高速化されたワークロードに統合する際に前提にできる事項を説明します。
単一スレッドの前提
特に指定がない限り、このパッケージの API は単一のスレッドから呼び出されることを想定しています。このパッケージが公開する高レベル API は再入可能であることが保証されておらず、エンドユーザーはメインスレッド以外のスレッドからそれらを呼び出さないでください。
集団的なマルチプロセス実行
このパッケージは、単一プログラム・複数データ (SPMD) スタイルでの集団的なマルチプロセス高速化をサポートしています。このスタイルでは、プログラム全体が複数の独立したプロセスとして起動され、それらの間で明示的なグローバル同期と通信を行いながら実行されます (例: mpirun -n 128 python my_program.py)。SPMD スタイルはジョブスケジューラーやその他の並列ソフトウェアとうまく組み合わせられ、大規模なプロセス数にもスケールするため、高性能・大規模なワークロードに推奨されるモデルであり、このページの主題でもあります。
このパッケージは異なる集団実行バックエンドに対応できるように設計されていますが、現在の実装は HPC システム向けの標準的なメッセージパッシング API である MPI を対象としています。実装にかかわらず、このパッケージは各プロセスを単一のスレッドが制御することを前提としています。MPI の場合、これは MPI_THREAD_FUNNELED 以下に相当します。
関数が集団実行をサポートしている場合は、そのドキュメントにその旨が記載されています。ドキュメントに集団実行への言及がない場合、その関数には集団的なセマンティクスがなく、制御プロセスだけから呼び出す必要があります。
集団関数に固有の戻り値と同期のセマンティクスは、その関数自体のドキュメントに記載されています。一般に、そのドキュメントでは次の点が明確にされているはずです。
-
関数が、各プロセスによって自身のローカルデータに対して独立に呼び出されることを想定しているのか、すべてのプロセスによって集団的に呼び出されることを想定しているのか。
-
引数がプロセス間でどのように一致していなければならないか。
-
戻り値がどのように届けられるか。結果が制御プロセスにのみ存在するのか、すべてのプロセスが同じ値を受け取るのか、あるいは各プロセスが分散データ構造のローカルな部分へのハンドルを受け取るのか。
現在、すべてのプロセスから集団的に呼び出せる関数は 1 つだけです: diagonalize_fermionic_hamiltonian()。これが集団的に呼び出される場合、すべてのプロセスが参加して作業を分担するのは固有値ソルバーのステップであり、そのため固有値ソルバーの実装はすべてのプロセスを利用できます。配置回復ループの残りの部分には分散実装がなく、制御プロセス (ランク 0) のみで実行されます。
1 回の反復におけるすべての部分空間は、1 回の呼び出しで固有値ソルバーに渡されるため、実装はプロセスをグループに分け、複数の部分空間を並列に対角化することができます。ソルバーが利用可能なプロセスをどのように使うかは、その固有値ソルバーの特性です。
既存の固有値ソルバーの実装の中には、呼び出し元のプログラムが MPI/SPMD 環境の外で実行されることを必要とするものがあります。それらは、たとえばユーザーに代わって mpirun を起動するなどして、独自の並列プロセスを内部で起動・管理するためです。このモードは対話的な作業やノートブックベースの作業に便利で、引き続きサポートされています。呼び出し元のプログラムに対する要件は、diagonalize_fermionic_hamiltonian() 関数の API リファレンスに記載されています。
マルチプロセス環境でのエラー処理
すべてのプロセスから集団的に呼び出される関数は、単一のプロセスだけで例外を発生させたり中断したりしてはいけません。そうすると、残りのプロセスがデッドロックしたり、一貫性のない状態になったりするためです。代わりに、エラー処理は実行コンテキスト全体に対するフェイルストップのセマンティクスに従います。エラーが発生した場合、実装は実行コンテキスト全体を集団的に中断できるよう備えておく必要があります (たとえば MPI_Abort を使用します)。
MPI の実装はそのような保証を提供していないため、API はプロセス間での調整されたエラー報告や例外の集団的な配信を保証できません。実装によっては、たとえば各プロセスに例外を発生させるなどして、エラーを参加しているすべてのプロセスに見えるようにしようとする場合もありますが、これはベストエフォートでしか提供できず、正しさや復旧のために依存してはいけません。
これらは集団的な実装が持つことを許されている特性であり、特定の実装についての保証ではありません。このパッケージで集団的に実行される唯一のステップは固有値ソルバーです (前のセクションを参照)。そのデフォルトの実装は分散されていないため、これらの考慮事項は、ユーザーが提供するカスタムの集団的な固有値ソルバーに当てはまります。