मैं सिमड/एसएसई के लिए बहुत नया हूं और मैं कुछ साधारण छवि फ़िल्टरिंग (धुंधला) करने की कोशिश कर रहा हूं। नीचे दिया गया कोड क्षैतिज दिशा में एक साधारण [1 2 1] वज़न के साथ 8-बिट ग्रे बिटमैप के प्रत्येक पिक्सेल को फ़िल्टर करता है। मैं एक समय में 16 पिक्सेल की रकम बना रहा हूं।सिमड/एसएसई नौसिखिया: सरल छवि फ़िल्टरिंग
कम से कम मेरे लिए इस कोड के बारे में बहुत बुरा लगता है, यह है कि इसमें बहुत सारे सम्मिलित/निकालें हैं, जो बहुत ही सुरुचिपूर्ण नहीं है और शायद सबकुछ भी धीमा कर देता है। स्थानांतरण करते समय एक reg से डेटा को दूसरे में लपेटने का कोई बेहतर तरीका है?
buf छवि डेटा है, 16-बाइट गठबंधन है। w/ज चौड़ाई और ऊंचाई कर रहे हैं, 16.
__m128i *p = (__m128i *) buf;
__m128i cur1, cur2, sum1, sum2, zeros, tmp1, tmp2, saved;
zeros = _mm_setzero_si128();
short shifted, last = 0, next;
// preload first row
cur1 = _mm_load_si128(p);
for (x = 1; x < (w * h)/16; x++) {
// unpack
sum1 = sum2 = saved = cur1;
sum1 = _mm_unpacklo_epi8(sum1, zeros);
sum2 = _mm_unpackhi_epi8(sum2, zeros);
cur1 = tmp1 = sum1;
cur2 = tmp2 = sum2;
// "middle" pixel
sum1 = _mm_add_epi16(sum1, sum1);
sum2 = _mm_add_epi16(sum2, sum2);
// left pixel
cur2 = _mm_slli_si128(cur2, 2);
shifted = _mm_extract_epi16(cur1, 7);
cur2 = _mm_insert_epi16(cur2, shifted, 0);
cur1 = _mm_slli_si128(cur1, 2);
cur1 = _mm_insert_epi16(cur1, last, 0);
sum1 = _mm_add_epi16(sum1, cur1);
sum2 = _mm_add_epi16(sum2, cur2);
// right pixel
tmp1 = _mm_srli_si128(tmp1, 2);
shifted = _mm_extract_epi16(tmp2, 0);
tmp1 = _mm_insert_epi16(tmp1, shifted, 7);
tmp2 = _mm_srli_si128(tmp2, 2);
// preload next row
cur1 = _mm_load_si128(p + x);
// we need the first pixel of the next row for the "right" pixel
next = _mm_extract_epi16(cur1, 0) & 0xff;
tmp2 = _mm_insert_epi16(tmp2, next, 7);
// and the last pixel of last row for the next "left" pixel
last = ((uint16_t) _mm_extract_epi16(saved, 7)) >> 8;
sum1 = _mm_add_epi16(sum1, tmp1);
sum2 = _mm_add_epi16(sum2, tmp2);
// divide
sum1 = _mm_srli_epi16(sum1, 2);
sum2 = _mm_srli_epi16(sum2, 2);
sum1 = _mm_packus_epi16(sum1, sum2);
mm_store_si128(p + x - 1, sum1);
}
मैं भी कोड के लिए संभव सुधार के बारे में सामान्य टिप्पणियों की सराहना होगी। धन्यवाद! – dietr