私は、アプリケーションのいくつかの機能をどれくらい時間がかかるか見るために計測しようとしています。私はリンクされたリストを使ってすべての時間をメモリに記録しています。OMP領域でのロック
このプロセスでは、リストの最後を追跡するグローバル変数を導入しました。新しいタイミング領域に入ると、リストの最後に新しいレコードが挿入されます。かなり簡単なもの。
しかし、私が追跡したい機能の一部は、OpenMP領域で呼び出されます。これは、複数回並行して呼び出される可能性が高いことを意味します。そして、これは私が困惑している場所です。
これは通常のPthreadsを使用していた場合、私はミューテックスのグローバル変数へのアクセスをラップし、それを1日と呼びます。しかし、私は確信しています:この戦略はまだOpenMP領域で呼び出される関数で動作しますか?で、彼らはロックを尊重しますか?例えば
(コンパイルが、私は全体のポイントを取得し、考えていません):
私は、その後に更新してしまうRecord *head;
Record *tail;
void start_timing(char *name) {
Record *r = create_record(name);
tail->next_record = r;
tail = r;
return r;
}
int foo(void) {
Record r = start_timing("foo");
//Do something...
stop_timing(r);
}
int main(void) {
Record r = start_timing("main");
//Do something...
#pragma omp parallel for...
for (int i = 0; i < 42; i++) {
foo();
}
//Do some more...
stop_timing(r);
}
:これは明白な答えを持っている場合
void start_timing(char *name) {
Record *r = create_record(name);
acquire_mutex_on_tail();
tail->next_record = r;
tail = r;
release_mutex_on_tail();
return r;
}
(謝罪 - 私はOpenMPフレームワークとマルチスレッド一般には比較的経験がありません。)
OpenMPがpthreads(通常はLinuxまたはosxの場合)上に構築されている場合、動作するはずです。 – tim18