critical 使用:
如果**段只需要乙個thread執行,可以使用single標明。如果**段需要id為0的thread執行,使用master標明。
那麼,如果**段需要各個cpu互斥執行,也就是要求每個cpu都執行一次,但任何時候只用乙個cpu在執行。這種
情況可以使用critical。從巨集觀上看,該**段被依次在各個cpu上被執行,各個cpu在執行該**的時序上沒有重疊。
測試**:
void testcritical()
clock_t t22 = clock();
printf("thread time = %d/n", t22 - t11);}}
clock_t t2 = clock();
printf("total time = %d/n", t2 - t1);}
執行結果:
test openmp
test openmp
test openmp
test openmp
test openmp critical
execute thread id is 0
thread time = 291
test openmp critical
execute thread id is 2
thread time = 290
test openmp critical
execute thread id is 1
thread time = 294
test openmp critical
execute thread id is 3
thread time = 286
total time = 1164
可以看出,整個執行的時間為1164ms,四個thread不是同步執行critical**段,而是依次執行的。
為了對比,注釋掉critical,
void testcritical()
clock_t t22 = clock();
printf("thread time = %d/n", t22 - t11);}}
clock_t t2 = clock();
printf("total time = %d/n", t2 - t1);}
再執行,結果為:
test openmp
test openmp critical
execute thread id is 0
test openmp
test openmp critical
execute thread id is 2
test openmp
test openmp critical
execute thread id is 3
test openmp
test openmp critical
execute thread id is 1
thread time = 224
thread time = 228
thread time = 237
thread time = 248
total time = 250
此時,total time基本上等於乙個thread的執行所耗時間。
OpenMP程式設計學習筆記九
openmp的execution model主要是幾個執行緒通過同時執行,從而完成乙個任務。與單核上的多執行緒併發執行是不同的,因為併發執行 實際上是執行緒在不同的時間段占有cpu。而openmp的執行緒,是在各自的cpu上執行,不存在各個執行緒在同乙個cpu上的排程。雖然有 多個cpu,但是記憶體...
OpenMP程式設計學習筆記九
openmp的execution model主要是幾個執行緒通過同時執行,從而完成乙個任務。與單核上的多執行緒併發執行是不同的,因為併發執行 實際上是執行緒在不同的時間段占有cpu。而openmp的執行緒,是在各自的cpu上執行,不存在各個執行緒在同乙個cpu上的排程。雖然有 多個cpu,但是記憶體...
openmp學習筆記
pragma omp parallel僅在您指定了 fopenmp編譯器選項後才會發揮作用。在編譯期間,gcc 會根據硬體和作業系統配置在執行時生成 建立盡可能多的執行緒。每個執行緒的起始例程為 塊中位於指令之後的 這種行為是 隱式的並行化 而 openmp 本質上由一組功能強大的編譯指示組成,幫您...