OpenMP是協助程式人員能夠方便編寫並行程式的一種解決方案,程式編寫人員主要的任務還是放在問題的空間結構與邏輯結構上。如何能夠使程式並行運行,是OpenMP解決的問題(演算法問題)。
OpenMP是通過將任務分配到不同的線程上完成的。
1. 設定線程數目omp_set_num_threads()
API。可以設定OpenMP能夠控制的並行線程數目。一般情況下,該數目等於處理器核心數。當然可以不等於。在使用OpenMP時,可以最先調用該API。如果不調用該API,可以使用num_threads() clause。
2. 最基本的平行處理:
2.1. #pragma omp parallel
#include <stdio.h>
#include <omp.h>
int main()
{
#pragma omp parallel
printf("OpenMP parallel threads test/n");
}
運行該代碼,可以看見,"OpenMP parallel threads test“ 被輸出的次數等於設定的thread的數目,也就是說,#pragma omp parallel之後的第一個代碼塊,將會分配給各個核去執行。可以改寫上面的代碼為:
#include <stdio.h>
#include <omp.h>
int
main()
{
#pragma omp parallel
{
printf("OpenMP
parallel threads test/n");
printf("OpenMP PARALLEL THREADS TEST/n");
}
}
雖然這個例子很簡單,但它能夠協助理解OpenMP核心思想:將代碼最終分配到不同的核(線程)上去運行。
2.2. #pragma omp parallel for
當在#pragma omp parallel 後增加for時,不再是將後面的程式碼片段簡單的交給不同的核去執行(這樣的話,就沒有必要這麼多此一舉),而是將for 迴圈這個整體迴圈任務交給不同的核去做。也就是說,每個核負責運行一部分循壞任務。這樣,就可以加速迴圈處理,從而使得程式提高了時間方面的效能。OpenMP負責拆分for迴圈然後分配,有好幾種不同的拆分演算法。由於迴圈變數是由各個線程共用的,所以在多重循壞中,環變數如何保持同步,結果如何保持正確,是掌握for的關鍵。