2013-03-19 18 views
8

Windows'tan Linux'a bazı SSE optimizasyon kodlarını yerleştiriyorum. Ve MSVC'de iyi çalışan aşağıdaki kodun GCC'de çalışmayacağını buldum. Kod, bir __m128i dizisini başlatmaktır. Her __mi28i 16 int8_t içerir. Bu doz gcc ile derlenir, ancak sonuç beklendiği gibi değildir. Aslında, gcc, __m128i'yi "long long int" olarak tanımladığında, kod, bir dizi gibi bir diziyi başlatacaktır: long long int coeffs_ssse3 [4] = {64, 83, 64, 36}. Ben googled ve söylendi "Bir vektör başlatmak için sadece taşınabilir yolu _mm_set_XXX intrinsics kullanmaktır." Ancak, bilmek istiyorum __m128i dizisini başlatmak için başka bir yolu var mı? Statik olarak daha iyi ve aşağıdaki kodu çok değiştirmemize gerek yok (çünkü aşağıdaki formatta tonlarca kodum var). Herhangi bir öneri takdir edilir.__m128i dizisi gcc'de statik olarak nasıl başlatılır?

static const __m128i coeffs_ssse3[4] = 
{ 
    { 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0}, 
    { 83, 0, 36, 0,-36,-1,-83,-1, 83, 0, 36, 0,-36,-1,-83, -1}, 
    { 64, 0,-64,-1,-64,-1, 64, 0, 64, 0,-64,-1,-64,-1, 64, 0}, 
    { 36, 0,-83,-1, 83, 0,-36,-1, 36, 0,-83,-1, 83, 0,-36,-1} 
}; 

cevap

7

O gcc agrega başlatma için aday olarak __m128* türlerini muamele ettiğini görünüyor. Standart tür olmadıkları için, bu davranış derleyiciden derleyiciye değişecektir. Bir yaklaşım 8-bitlik tamsayılar hizalanmış dizi olarak diziyi bildirmek için olurdu, o zaman sadece bir işaretçi döküm:

static const int8_t coeffs[64] __attribute__((aligned(16))) = 
{ 
    64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 64, 0, 
    83, 0, 36, 0,-36,-1,-83,-1, 83, 0, 36, 0,-36,-1,-83, -1, 
    64, 0,-64,-1,-64,-1, 64, 0, 64, 0,-64,-1,-64,-1, 64, 0, 
    36, 0,-83,-1, 83, 0,-36,-1, 36, 0,-83,-1, 83, 0,-36,-1 
}; 
static const __m128i *coeffs_ssse3 = (__m128i *) coeffs; 

Ancak, Visual Studio tarafından desteklenen bu sözdizimini (__attribute__((aligned(x)))) sanmıyorum Bu nedenle, tüm hedef platformlarınızda istediğiniz hizalamayı elde etmek için doğru yönergeleri kullanmak için oradaki bazı #ifdef numarasına ihtiyacınız olacaktır.

+0

Teşekkür ederiz @Jason! Yöntemini denedim ve çok iyi çalıştı. (Senin cevapta uint8_t, dizi negatif değerler içerdiğinden int8_t olmalı. Bu bir yazım hatası olabilir ve cevabını mükemmel yapmak için değiştirebilirsin :) – shengbinmeng

İlgili konular