我試圖在我的應用程序中測試一些功能,以查看它們需要多長時間。我使用鏈接列表在內存中記錄所有時間。在OMP區域鎖定
在這個過程中,我介紹了一個跟蹤列表的末尾的一個全局變量。當我進入一個新的時間區域時,我在列表的最後插入一條新記錄。相當簡單的東西。
但是,我想跟蹤的一些函數在OpenMP區域中調用。這意味着他們可能會被並行調用多次。這就是我難住的地方。
如果這是正常使用的Pthreads,我想簡單地包裹訪問全局變量的互斥和收工。但是,我不確定:這個策略是否仍然可以在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