2010-04-21 47 views
7

gcc是否有內存對齊編譯指示,類似#pragma vector aligned英特爾編譯器中? 我想告訴編譯器使用對齊的加載/存儲指令來優化特定的循環。爲了避免可能的混淆,這不是關於結構打包。gcc內存對齊編譯指示

e.g:

#if defined (__INTEL_COMPILER) 
#pragma vector aligned 
#endif 
     for (int a = 0; a < int(N); ++a) { 
      q10 += Ix(a,0,0)*Iy(a,1,1)*Iz(a,0,0); 
      q11 += Ix(a,0,0)*Iy(a,0,1)*Iz(a,1,0); 
      q12 += Ix(a,0,0)*Iy(a,0,0)*Iz(a,0,1); 
      q13 += Ix(a,1,0)*Iy(a,0,0)*Iz(a,0,1); 
      q14 += Ix(a,0,0)*Iy(a,1,0)*Iz(a,0,1); 
      q15 += Ix(a,0,0)*Iy(a,0,0)*Iz(a,1,1); 
     } 

感謝

回答

8

http://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html

typedef double aligned_double __attribute__((aligned (16))); 
// Note: sizeof(aligned_double) is 8, not 16 
void some_function(aligned_double *x, aligned_double *y, int n) 
{ 
    for (int i = 0; i < n; ++i) { 
     // math! 
    } 
} 

這不會使aligned_double 16字節寬。這隻會使它對齊到一個16字節的邊界,或者更確切地說是數組中的第一個邊界。看看我的電腦上的反彙編,只要我使用對齊指令,我開始看到很多矢量ops。目前我正在使用Power架構計算機,所以它是altivec代碼,但我認爲這是你想要的。

(注:我沒有使用double當我測試了這一點,因爲那裏的AltiVec不支持雙浮筒)

您可以看到使用類型自動向量化的其他一些例子屬性在這裏:http://gcc.gnu.org/projects/tree-ssa/vectorization.html

+0

既不。我有數組,該編譯器無法確定對齊方式。 我必須具體說明使用對齊的加載和存儲。它不會是編譯器選項,它必須是編譯指示,對每個單獨的循環進行矢量化。 – Anycorn 2010-04-21 23:46:46

+0

爲什麼你不能在數組上使用可變屬性? – 2010-04-21 23:47:18

+0

數組是malloced的,加上數組的結構相當複雜。 具體來說,它是一個四維張量 – Anycorn 2010-04-21 23:48:51

5

我用g ++版本4.5.2(包括Ubuntu和Windows)嘗試了你的解決方案,並且它確實向傳遞了向量化循環的代碼

如果刪除了alignment屬性,那麼它會使用未對齊的加載矢量化循環。

如果函數被內聯,以便可以在指針消除的情況下直接訪問數組,那麼它就是使用對齊的加載進行矢量化的。

在這兩種情況下,alignment屬性都會防止向量化。這頗具諷刺意味:「aligned_double * x」本來是爲了實現矢量化,但它卻是相反的。

哪個編譯器報告過矢量化循環?我懷疑它不是一個gcc編譯器?

1

GCC是否有內存對齊編譯,類似的#pragma矢量對準

它看起來像GCC的新版本有__builtin_assume_aligned

內置功能:void * __builtin_assume_aligned (const void *exp, size_t align, ...)

該函數返回其第一個參數,並允許編譯器假定返回的指針至少對齊字節對齊。 這個內置參數可以有兩個或三個參數,如果有三個參數, 第三個參數應該是整數類型,如果它不是零,那麼 表示不對齊偏移量。例如:

void *x = __builtin_assume_aligned (arg, 16); 

意味着,編譯器可以假定X,設定爲精氨酸,是至少16字節對齊,而:

void *x = __builtin_assume_aligned (arg, 32, 8); 

意味着,編譯器可以假定爲X,設定爲arg,(char *)x - 8是32字節對齊的。

根據大約2010年Stack Overflow的其他一些問題和答案,似乎內置在GCC 3和GCC 4早期不可用。但我不知道截止點在哪裏。