openacc中常用的一些導語與子語 :
#pragma acc kernels
如同上一篇代碼所顯示,在代碼前之間加上,編譯器發現這一指令時會自動将接下來代碼中可以改動的改成并行
一重循環嵌套啟用一個或多個gangs和相應的vectors來實作多線程,
二重循環嵌套和三重循環嵌套時增加gangs和works來實作多線程;
如果想看經過編譯後的代碼,可以在編譯的時候選用選項nollvm和keepgpu
pgcc -acc -minfo -ta=tesla:nollvm,keepgpu test.c
可能得到中間代碼檔案 test.n001.gpu ,其中tesla為顯示卡的架構
#pragma acc loop
用loop相對于前面的kernel,可以更加準确地指導編譯器的并行化工作
loop導語直接跟着循環語句
loop在使用時會自動檢測資料的依賴性,當資料互相依賴時會将資料串行運作如下面例子:
顯然第一個loop下面的循環中的資料不是互相依賴的可以轉化為并行,
第二個loop下面的循環中資料是互相依賴的,是以隻能以串行的方式進行
最後傳回值為:
independent子語告訴編譯器該循環的疊代步是互相獨立的,強制允許生成并行代碼
編譯器将不檢測循環内資料的依賴性而選擇并行處理,最終結果為:
用independent子語時編譯器可能會誤解原程式想表達的意思,是以要注意;
reduction子語:
reduction子語常用語一些計算的求和,乘積等,以求和為例:
s=∑ni=1ai=s1+s2=∑n1i=1ai+∑ni=n1+1ai
将資料分成兩部分相加,最後再賦給s,相乘也一樣
在c/c++中reduction子語試用于int,float,doubl,complex,char,wchar_t,适用于:+,*,max,min,&,|,%,&&,||
用法如下面例子:
在reduction(;)第一個參數為數學符号,第二個參數為最後賦予值的變量