single的用法。
parallel的目的就是能夠讓多個CPU協調處理問題,從而提高運行效能。例如,如下的代碼,各個CPU都會執行一次。
#pragma omp parallel
{
printf("test OpenMP/n");
}
更多的時候,我們可能希望這種代碼只要在一個CPU上執行就行了,以便減少CPU的功耗。這時可以使用single。
測試代碼如下:
void testSingle()
{
omp_set_num_threads( 4 );
#pragma omp parallel
{
printf("test OpenMP/n");
#pragma omp single
{
printf("test OpenMP single/n");
printf("execute thread ID is %d/n", omp_get_thread_num());
}
}
}
一個運行結果如下:
test OpenMP
test OpenMP
test OpenMP
test OpenMP
test OpenMP single
execute thread ID is 0
另外一個運行結果:
test OpenMP
test OpenMP single
execute thread ID is 1
test OpenMP
test OpenMP
test OpenMP
可以看出,在一個parallel region內,single代碼塊始終只會被執行一次。
不加single的一個運行結果為:
test OpenMP
test OpenMP single
execute thread ID is 0
test OpenMP
test OpenMP single
execute thread ID is 2
test OpenMP
test OpenMP single
execute thread ID is 1
test OpenMP
test OpenMP single
execute thread ID is 3
其實,"test OpenMP"被輸出多次,這個是比較難理解的。因為一個CPU已經處理過了,就不應該由別的
CPU再去處理。可能是OpenMP的最初模型就是如此,或者這個本身就是OpenMP的設計缺陷,所以增加
single directive來迴避這一點。如果使用者只希望一段代碼由一個CPU來處理,就使用single ,
畢竟這是一個崇尚低功耗的年代。
single程式碼片段可以由任何一個CPU或者thread執行,如果想讓固定的CPU或者thread運行一段代碼,可以使用
master。master的局限性就在於只能由ID為0的thread執行該程式碼片段。測試代碼:
void testMaster()
{
omp_set_num_threads( 4 );
#pragma omp parallel
{
printf("test OpenMP/n");
#pragma omp master
{
printf("test OpenMP master/n");
printf("execute thread ID is %d/n", omp_get_thread_num());
}
}
}
運行結果為:
test OpenMP
test OpenMP master
execute thread ID is 0
test OpenMP
test OpenMP
test OpenMP
運行N次,"execute thread ID is 0"總是被輸出。master到底有何用處,能夠解決什麼實際問題,我還不能理解。
需要繼續深入學習。