天天看點

《OpenACC并行程式設計實戰》—— 3.2 導語格式

本節書摘來自華章出版社《openacc并行程式設計實戰》一 書中的第3章,第3.2節,作者何滄平,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

openacc的絕大部分功能都是以導語的形式實作,導語有一個基本格式,這個格式簡單易學。本書中關于openacc文法的描述,都會引用官方标準《the openacc application programming interface version 2.5》,不易懂的地方會追加解釋。

在c/c++中,使用#pragma預處理機制指定openacc導語,文法是:

<code>#pragma acc 導語名字 [子語清單] 換行</code>

每個導語都以#pragma acc開始。導語的其他部分都遵守c/c++中pragma的使用規範。空格和跳格統稱為空白字元。#的前後都可以使用空白字元;導語中使用空白字元來分隔各字段。#pragma後面的預處理标記使用宏替換。導語區分大小寫。一個openacc導語作用于緊接着的語句、結構塊和循環。子語清單是一串用逗号分隔的子語。這裡的“換行”意為每個導語要獨占一行,不要在一行上寫多個導語。

《OpenACC并行程式設計實戰》—— 3.2 導語格式

例3.3給出了幾個格式正确的導語例子,裡面的導語、子語的具體含義先不必理會,後文會詳述。符号代表空白字元(強調說明可以使用空白字元)。在這幾行導語中,private(i)和independent這兩個子語既可以使用空白字元分隔,又可以使用逗号分隔。最後兩行組成一個導語,續行符“”将長導語分寫在多行,便于閱讀。去掉所有的續行符和換行符,其他不做任何改變,多行導語就成為僅占一行的長導語。

fortran自由格式源檔案中,用下列格式指定openacc導語:

<code>!$acc 導語名字 [子語清單]</code>

第一個注釋字元(!)可以放在任意列,但它前面隻能是空白字元(空格和跳格的統稱)。前導符!$acc必須以一個整體出現,中間不能有空白字元。fortran語言的每行長度、空白字元、續行符規則同樣适用于導語行。導語起始行的前導符後面必須接有空白字元。待續行中導語部分的最後一個非空白字元必須是連字元(&amp;),連字元後面仍然可以寫注釋;接續行中導語必須以前導符開始(前面允許有空白字元),前導符後面的第一個非空白字元可以是續行符。導語行上也可以放注釋,注釋以感歎号開始,直至行尾。如果前導符後面的第一個非空白字元是一個感歎号,那麼該行被忽略。子語清單是一串用逗号分隔的子語。

《OpenACC并行程式設計實戰》—— 3.2 導語格式
《OpenACC并行程式設計實戰》—— 3.2 導語格式

例3.4中給出幾個fortran版本的導語示範。空白字元的使用規則與c版本相同,不同的是續行規則。第3~5行是分寫成3行的一個導語,每行都需要以前導符!$acc開始,而c版則不需要以#pragma開始。

在固定格式fortran源代碼檔案中,openacc導語可以采取下列形式中的一個:

    !$acc 導語名字 [ 子語清單 ]

    c$acc 導語名字 [ 子語清單 ]

    *$acc 導語名字 [ 子語清單 ]

前導符(!$acc、c$acc或*$acc)必須寫在1~5列。固定格式的每行長度、空白字元、續行、列的規則同樣适用于導語行。導語起始行第6列必須是空格或0,接續行導語在第6列不能是空格或零。導語行也可以添加注釋,注釋可以從第7列(包含)之後的任意列以感歎号開始,至行尾結束。

在fortran中,導語不區分大小寫。分寫在多行的單個程式語句中間不能混入導語,同樣,分寫在多行的單個導語中間也不能混入程式語句。本文檔中所有fortran版導語例子都采用自由格式,建議讀者也盡量避免新開發fortran 77代碼。

每個導語中隻能有一個導語名字,一個例外是組合導語,它被視為單個導語名字。如無特别規定,多個子語出現的順序無關緊要,子語可以重複出現多次。有些子語的參數會包含一個清單。清單是用逗号分隔的一串子語或參數。