2012-03-10 63 views
0

我正在用C編寫一個程序(一個2d泊松求解程序),我使用openMP來加速一個大的for循環。我觀察到,在openMP並行塊內部,即使在包含#pragma always向量指令的情況下,for循環也不會被矢量化。對於編譯,我使用pathscale編譯器。OpenMP中循環的向量化

我想向量化的代碼看起來是這樣的:

#pragma omp parallel shared(in, out, lambda,dim,C) private(k) 
    { 
      #pragma omp for schedule(guided,dim/nthreads) nowait 
      for(k = 0;k < dim; k++){ 
        in[k] = C*out[k]*lambda[k]; 
      } 
    } 

哪裏出,拉姆達和是雙精度數組。

但是即使我有的#pragma總是矢量,什麼編譯器的答案是:

warning: ignoring #pragma always vector 

你知道,如果有任何解決方法嗎?

謝謝。

+2

我很想知道你不會從向量化/並行化循環中獲得太多東西。有很多內存訪問工作很少。 – Mysticial 2012-03-11 21:16:01

+0

@Mysticial,這是比賽入場的一部分,它確實有幫助。 :) – Konstantinos 2012-03-18 05:31:18

回答

3

我看了一下the User Guide for the PathScale compiler,並沒有找到#pragma always也沒有找到#pragma vector。所以我認爲編譯器只是告訴你它不識別這個編譯指示,而忽略它。

然而在第7.4.5我發現下面的選項,應該可以幫助您與矢量:

的用戶代碼矢量...由標誌-LNO:simd[=(0|1|2)],它啓用或禁用內環矢量控制。 0關閉矢量化器,1(默認值)僅在可以確定不存在由於次優對齊而導致的不良性能影響時才導致編譯器矢量化,並且2將無任何約束地進行矢量化(這是最積極的)。

-LNO:simd_verbose=ON將向量化器信息(從矢量化用戶代碼)打印到標準輸出。

作爲一個側面說明(猜測,你可能會採取#pragma always vector從)Intel's compiler has #pragma vectoralways是一個可能的參數的編譯。但是編譯指示通常是特定於編譯器的,除非少數擴展(OpenMP是一種),它們受多個供應商支持。

+0

謝謝阿列克謝。我只是自己找到了它並嘗試了它,但是就像Mysticial所說的那樣,這項工作還不夠,它似乎能夠發揮這麼大的作用。 – Konstantinos 2012-03-11 23:22:38