いくつかの OpenMDAO コンポーネントに基礎となる並列処理を追加することに興味があります。これらのコンポーネントのコードの大部分は Fortran で書かれています。Fortran コードは Python でラップされ、OpenMDAO で Python モジュールとして使用されます。OpenMP または OpenMPI を使用して、これらの Fortran コードを並行して実行したいと考えています。すでに OpenMDAO の組み込み並列機能を使用することを計画しているため、これは並列処理の 2 番目のレイヤーになります。これは実現可能でしょうか?もしそうなら、OpenMDAO でうまく動作する推奨されるアプローチはありますか?
1 に答える
まず、OpenMP に関する質問に答えます。現在、OpenMDAO は OpenMP 自体を使用しておらず、すぐに変更する予定はありません。つまり、フレームワークは、たまたま Fortran コードで使用されているかどうかをまったく知りません。もちろん、MPI + OpenMP コードに関する通常の注意事項はすべて有効ですので、ご安心ください!
コンポーネント自体で MPI 並列処理を使用したい場合は、OpenMDAO で直接サポートされています。この状況では、コンポーネント自体が複数のプロセッサを要求するという、かなり単純なチュートリアルがあります。このチュートリアルの注目すべき機能は、コンポーネントがフレームワークに複数のプロセッサを要求する場所です。
def get_req_procs(self):
"""
min/max number of cpus that this component can use
"""
return (1,self.size)
この場合、コンポーネントは 1 proc からその配列内の要素数までの任意の場所を受け入れます。あなたの場合、それを単一の値に制限したいかもしれません。その場合、単一の整数を返すことができます。
その他の注目すべき部分は次のとおりです。
def setup_distrib_idxs(self):
"""
specify the local sizes of the variables and which specific indices this specific
distributed component will handle. Indices do NOT need to be sequential or
contiguous!
"""
comm = self.comm
rank = comm.rank
#NOTE: evenly_distrib_idxs is a helper function to split the array up as evenly as possible
sizes, offsets = evenly_distrib_idxs(comm.size, self.size)
local_size, local_offset = sizes[rank], offsets[rank]
self.local_size = int(local_size)
start = local_offset
end = local_offset + local_size
self.set_var_indices('x', val=np.zeros(local_size, float),
src_indices=np.arange(start, end, dtype=int))
self.set_var_indices('y', val=np.zeros(local_size, float),
src_indices=np.arange(start, end, dtype=int))
このコードは、分散データが多くの proc に分割される方法をフレームワークに伝えます。このメソッドの詳細は、実装ごとに大きく異なります。場合によっては、すべての proc にすべてのデータを持たせることができます。他のもの (このようなもの) では、データを procs 全体に均等に分散します。さらに別のケースでは、グローバル データと分散データが組み合わされている可能性があります。
OpenMP のみを使用する予定の場合、おそらくすべてのプロセス間ですべてのデータを共有しますが、それでも複数の proc を要求します。そうすれば、OpenMDAO がコンプに十分な数の proc を割り当てて、マルチスレッド コンテキストで役立つようにすることができます。タスクを分割するために使用できる通信オブジェクトが渡されます。
純粋に MPI を使用することを計画している場合は、おそらく (確実ではありませんが) 分散データを操作することになります。複数の proc を要求したい場合もありますが、データを分割する必要もあります。
OpenMP と MPI を使用する場合は、分散データと共有データの組み合わせが必要になる可能性があります。