iOSで使用するためにいくつかのOpenMP並列化ループをGCDに移植しています。モデリングするのに最適な方法がわからない構造に遭遇しました。
OpenMPループは、共有状態ブロックに対していくつかの重要な操作を実行します。この操作では、可能なOpenMPスレッドごとに1つを割り当て、ループ後に結果を結合(事実上削減)します。このように(簡略化):
const int max_threads = omp_get_max_threads();
state_block state[max_threads];
#pragma omp parallel for shared(state)
for(unsigned int i = 0; i < some_count; i++) {
// do some stuff
update_state(state[omp_get_thread_num()]);
}
merge_state_data(state, max_threads);
GCDは、可能なスレッドの最大数(そうですか?)または現在使用しているスレッドを知る方法を提供しないため、このパターンは機能しません。状態ブロックのサイズは重要であり、反復回数が多いため、ループの反復ごとに1つを割り当てることも、純粋な最悪のケースとして妥当ではありません。
カスタムディスパッチソースを使用DISPATCH_SOURCE_TYPE_DATA_ADD
して状態の更新を行うことも考えられますが、そのようにアトマイズすると、何千ものソースが必要になり、それは間違っているようです。
GCDで、または一般的にここのデザインで、私が見逃しているものはありますか?
ありがとう。