Ş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.
'myLookupTable [static_cast (v) * LUT_RATIO]' üzerinde geliştirebileceğinize kim inandınız? Burada yapılan bir hesaplama yok, SSE neden uygulanabilir? –
ildjarn
@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