2011-04-13 88 views
5

嘿, 我在OpenMP中有很長的共享變量列表,所以我必須在Fortran中拆分行,並使用「&」 - 語法來確保這些行粘在一起!OpenMP幾個「共享」 - 指令?

類似的東西:

!$OMP PARALLEL DEFAULT(private) SHARED(vars...., 
    & more_vars..., 
    & more_vars... 
    &) 

在編譯的OpenMP沒有時,因爲只有第一喜歡的是公認的評論給我的錯誤!現在的問題是我不能添加「!」與「&」那些線的前方在前面不支持OpenMP的編譯:

!$OMP PARALLEL DEFAULT(private) SHARED(vars...., 
!  & more_vars..., 
!  & more_vars... 
!  &) 

,因爲比它不使用OpenMP編譯了...但我想,以支持各種編譯在短短的代碼...關於如何做的任何建議?

回答

8

您沒有使用正確的語法。如果你看的OpenMP V3.0規範,第2.1.2自由形式的指令,你會看到以下內容:

站崗只能用空格 只要它先出現在任何列(空格和製表符)。它必須顯示爲一個單詞,沒有介入 字符。 Fortran自由表格行長度,空格和延續規則適用於 指令行。初始指令行必須在標記之後有一個空格。續 指令行必須有一個&符號作爲該行上的最後一個非空字符,前面的 指向該指令中的任何註釋。延續指令行可以在 和號之前和之後具有 &符號,該指令具有可選的空白空間。

所以,正確的形式應該是:

!$OMP PARALLEL DEFAULT(private) SHARED(vars...., & 
!$OMP& more_vars..., & 
!$OMP& more_vars... & 
!$OMP&) 

對於固定的形式,它是同類型的東西。你開始每一行OMP哨兵,並確保延續線在第6列有一個非空白和非零字符。

+0

哦謝謝,不知道!這幫了我很多! – tim 2011-04-13 16:20:28

+0

對不起,我錯了,那對我不起作用: 語法錯誤,在期望以下某個時發現'&':/ tim 2011-04-13 17:07:27

+1

您使用的編譯器是什麼?另外,我的例子是用於自由格式的,儘管你的例子看起來更像你使用固定格式。如果是固定格式,那麼您只需要在連續行上具有標記和列6非空白(即c $ omp + shared_var,shared_var)。 – ejd 2011-04-13 17:57:03

0

好吧,我發現瞭解決方案:循環標識符(我的意思是我在下面的代碼:do i=1,end)必須共享,因爲我正在使用DEFAULT(private)我不得不把這寫入共享變種列表:)希望這有助於某人某天:)

+1

既然你沒有展示你如何使用這個循環,那麼你所說的是正確的。但是,通常情況下,如果在並行區域內有循環,則希望循環索引爲私有。實際上,默認情況下,OpenMP將使循環索引爲私有的,以便您沒有競爭條件。此評論似乎與原始問題完全無關,所以我不確定這是最佳答案。 – ejd 2011-04-19 17:15:29

+0

對不起,是的,你說得對,對此抱歉。我原本想把這個發佈到我的問題「Fortran中的OpenMP:數據類型的變化?」但只是搞砸了,對不起!但是,我覺得循環索引不能是私人的,你確定你的陳述嗎?我不明白爲什麼該程序設置爲共享時立即工作。我只是不能發佈代碼,因爲它有點太長,我不知道要剝離什麼,但現在它可以工作,我可能不需要 – tim 2011-04-19 17:33:48