2012-05-14 9 views
10

Şu anda dahili işlevleri kullanarak optimize etmeye çalıştığım büyük bir piksel işleme işlevim var.Look-Up Tablosunu Kullanma SIMD'yi Kullanma

SSE acemi olmak için, arama tablolarını içeren kodun nasıl ele alınacağından emin değilim.

Temelde, aşağıdaki vanilya C++ kodu vektörize çalışıyorum:

//outside loop 
const float LUT_RATIO = 1000.0F; 

//in loop 
float v = ... //input value 
v = myLookupTable[static_cast<int>(v * LUT_RATIO)]; 

deniyorum Ne:

//outside loop 
const __m128 LUT_RATIO = _mm_set1_ps(1000.0F); 

//in loop 
__m128 v = _mm_set_ps(v1, v2, v3, v4); //input values 
__m128i vI = _mm_cvtps_epi32(_mm_mul_ps(v, LUT_RATIO)); //multiply and convert to integers 
v = ??? // how to get vI indices of myLookupTable? 

düzenleme: ildjarn benim açımdan açıklama gerektiren bir noktasıdır. Ben arama tablosu kodu için hızlandırma elde etmeye çalışmıyorum, sadece bu bölüm SSE'den teorik olarak faydalanabilecek 2 diğer parça arasında sıkıştırılmış olduğundan, özellikle yeniden arama yapmak için yüzerlere geri kayıtlar saklamaktan kaçınmaya çalışıyorum.

+0

'myLookupTable [static_cast (v) * LUT_RATIO]' üzerinde geliştirebileceğinize kim inandınız? Burada yapılan bir hesaplama yok, SSE neden uygulanabilir? – ildjarn

+2

@ildjarn Eminim ki bu kısmı kendim geliştiremiyorum, ama bu işlevin diğer kısımlarını iyileştirmeyi umuyorum ve "__m128" ile "float [4]" arasında ileri geri gitme cezasını önlemek için Ayrıca bu kodu da vektör etmeliyim. – Rotem

cevap

12

Bir sonraki yıla kadar beklerseniz, Intel'in Haswell CPU'ları, toplanan yükler için talimatlar içeren AVX2'ye sahip olacaktır. Bu, örn. Bir talimatta 8 paralel LUT araştırması (bkz. Ör. VGATHERDPS). Bunun dışında, LUT'leriniz oldukça küçük değilse (örneğin 16 eleman), bu durumda PSHUFB'u kullanabilirsiniz.

+0

Maalesef LUT'lerim 10000 öğeden büyük. Yeni bir işlemci beklemek zorunda olsaydım bile, Haswell'i asgari bir cpu olarak belirlemek meşru olmazdı. :) Bilgi için teşekkürler. – Rotem

+1

Tamam - AÜT'lerinizi yaklaşık olarak tahmin ederseniz, örn. Bir polinom ile o zaman SSE ile bir galibiyete sahip olabilirsiniz, yoksa korkarım ki skaler kodla sıkışmışsınızdır. –

+3

Skaler kodu o zaman. Bu iyi bir haber, bu konuda endişelenmeyi bırakabilirim ve daha fazla optimizasyon sağlayabilecek parçalar üzerinde çalışmaya devam edebilirim. – Rotem