天天看點

OpenACC讀書筆記(一)

今年運氣比較好,學了cuda之後,了解到了gpu的另兩種使用語言opencl和openacc,

opencl(open computing language ,開放計算語言)是面向異構系統的并行程式設計語言的免費标準,支援多種裝置,包含cpu(多核多線程cpu),gpu(nvidia,amd),數字信号處理器(居然還支援dsp),但缺點是對源代碼進行并行改進的代碼量較大;

openacc與cudac和opencl不同,不需要學習相對更底層的東西,不需要對代碼進行很大的改進,在代碼中間加上相應的指令,再用相應的編譯器進行編譯就能對源程式進行加速,因為是編譯器自動轉換為并行處理的語言是以效率比不上用cuda或着用opencl對源代碼進行改進的效率,而且現在openacc隻支援c/c++,fortran(比較幸運的是之前支援openacc的編譯器pgi隻能免費試用1個月,購買要正版1w多,今年剛剛開放社群版即免費版本,這麼好的東西不試一下太可惜了)

openacc指令包含 導語和子語兩部分如:

中#pragma acc loop 是導語,independent是子語,導語的作用是告訴編譯器接下來代碼中大緻要轉換為怎樣的并行代碼(實作什麼功能),子語的作用是幫助編譯器更精确地改代碼,具體的作用可以在用的過程中了解;

要使用openacc的指令要使用相應的編譯器,比如gcc不支援openacc

用以下代碼來驗證:

如果用gcc進行編譯

gcc test.c -o test.c

./test.exe

會出現 openacc is not support

用支援openacc的pgi編譯器進行編譯:

pgcc -acc test.c -o test.exe

會出現number of device :1

支援openacc的裝置為一個

像cuda一樣先學習循環數組進行

這裡通過在循環前面加上#pragma acc kernels指令來将下面的循環改為并行處理。

通過pgcc進行編譯後執行可以得到結果;

pgcc -acc -minfo klc.c -o klc.exe

通過在 選項-minfo可以傳回一些編譯資訊:

設定pgi編譯器環境的變量:export pgi_acc_notity=1

将環境變量告訴編譯器可以得到運作程式時輸出的一些cuda核心配置

./klc.exe

launch cuda kernel file=…

function =main line=12 device=0,threadid=1 num_gangs=2 num_workers=1 vector_length=128 grid=2 block=128

openacc中gangs,workers,vectors類似于cuda中的grids,blocks,threads來表示線程數,線程塊數,不同的是在cuda中這些量可以表示為三維的結構,而在openacc中表示為一維,其中gangs對應blocks,workers、vectors對應threads;

讀《openacc并行程式設計實戰》後記

OpenACC讀書筆記(一)

繼續閱讀