マルチプロセスおよびマルチスレッドによる高速化のサポート
このページでは、本パッケージがマルチスレッドおよびマルチプロセスによる高速化をどの程度サポート 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)上でのみ実行されます。
既存の固有値ソルバーの実装の中には、内部で独自の並列プロセスを起動・管理するため(例えば、ユーザーに mpirun 代わって を呼び出すなど)、呼び出し元プログラムをMPI/SPMD環境の外で実行する必要があるものもあります。 このモードは、対話型やノートブック形式での作業に便利であり、引き続きサポートされています。呼び出し元プログラムに対する要件については、当該関 diagonalize_fermionic_hamiltonian() 数のAPIリファレンスに記載されています。
マルチプロセス環境におけるエラー処理
すべてのプロセスから一斉に呼び出される関数は、例外を発生させたり、単一のプロセスのみを中止させたりしてはならない。そうすると、残りのプロセスがデッドロック状態に陥ったり、不整合な状態になったりしてしまうからである。 その代わりに、エラー処理は実行コンテキスト全体に対して「フェイルストップ」セマンティクスに従います。つまり、エラーが発生した際、実装側は実行コンテキスト全体を一括して中止する準備をしておかなければなりません(例えば、を使用するなど MPI_Abort)。
MPIの実装ではそのような保証が提供されていないため、このAPIでは、プロセス間でエラー報告の連携や例外の集合的な伝達を保証することはできません。 実装によっては、エラーをすべての参加プロセスに通知しようとする場合もある(たとえば、各プロセスに例外を発生させるなど)。ただし、これはあくまで「可能な限り」提供されるものであり、正しさや回復性についてこれに依存してはならない。
これらは、集合的な実装が持つことが許容される特性であり、特定の特性について保証するものではありません。 このパッケージにおいて、集合処理を伴う唯一のステップは固有値ソルバーです(前の節を参照)。そのデフォルトの実装は分散処理に対応していないため、これらの考慮事項は、ユーザーが提供するカスタムで集合処理を行う固有値ソルバーに適用されます。