天天看點

OpenACC讀書筆記(二)

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(;)第一個參數為數學符号,第二個參數為最後賦予值的變量

OpenACC讀書筆記(二)

繼續閱讀