2011-11-28 143 views
1
typedef float v4sf __attribute__ ((mode(V4SF))); 

這是在GCC中。任何人都知道等價語法?在Visual Studio C++中v4sf和__attribute__的等價物是什麼?

VS 2010將顯示__attribute__沒有此類型的存儲類,且模式未定義。

我在互聯網上搜索,並在GCC說

相當於__attribute__(aligned(size))

這是前UNIX開發人員或人編寫的 在GCC你實現多平臺運行的代碼有幫助 使用相同的結果 屬性(aligned(...))

有關詳細信息,請參閱此處: http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Type-Attributes.html#Type-Attributes

完整的GCC代碼是在這裏:http://pastebin.com/bKkTTmH1

回答

3

如果您正在尋找VC對準指令++是__declspec(align(16))。 (或任何你想要的比對來定)

而且使用例子是這樣的:

__declspec(align(16)) float x[] = {1.,2.,3.,4.}; 

http://msdn.microsoft.com/en-us/library/83ythb65.aspx

注意兩個attribute(海合會)和__declspec(在VC++)是編譯器特定的擴展。

編輯:

現在我走在代碼中的第二次看,它會採取更多的工作不僅僅是用VC++相當於讓它在VC++編譯更換__attribute__線。如果這些宏/函數,您正在使用

VC++沒有任何:

  • __builtin_ia32_xorps
  • __builtin_ia32_mulps
  • __builtin_ia32_addps
  • __builtin_ia32_storeups

你最好用SSE intrinsics代替所有這些 - 這些都可以在GCC和VC++上運行。


這裏的轉化爲內部函數的代碼:

float *mv_mult(float mat[SIZE][SIZE], float vec[SIZE]) { 
    static float ret[SIZE]; 
    float temp[4]; 
    int i, j; 
    __m128 m, v, r; 

    for (i = 0; i < SIZE; i++) { 
     r = _mm_xor_ps(r, r); 

     for (j = 0; j < SIZE; j += 4) { 
      m = _mm_loadu_ps(&mat[i][j]); 
      v = _mm_loadu_ps(&vec[j]); 
      v = _mm_mul_ps(m, v); 
      r = _mm_add_ps(r, v); 
     } 

     _mm_storeu_ps(temp, r); 
     ret[i] = temp[0] + temp[1] + temp[2] + temp[3]; 
    } 

    return ret; 
} 
+0

嗨了! :)是的。我注意到了。我將不得不從v4sf轉換爲m128類型...讓我試試:)謝謝。上證所對我來說是新的。哈。 – CppLearner

+1

實際上看起來並不難。我使用轉換後的代碼編輯了我的答案。但是,我想指出,未對齊的訪問可能會導致您的性能下降。所以您可能需要考慮修改算法以對齊數據。 – Mysticial

+0

嗚。非常感謝你。我創建了一個聯合__m128來對齊數據。謝謝Mysticial的未對齊。 – CppLearner

1
+0

謝謝。是。現在最大的問題是在m128和v4sf之間轉換,因爲操作需要使用m128類型。謝謝。 – CppLearner

相關問題