Покритикуйте реализацию на SSE2
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті
double _sse2_imabsdiffmeanROI_LC_8UC3(const uint8_t * const src0, const uint8_t * const src1, const size_t sz_r0, const size_t sz_c0, const size_t sz_r1, const size_t sz_c1, const size_t sz_r0b, const size_t sz_r0e, const size_t sz_c0b, const size_t sz_c0e, const size_t sz_r1b, const size_t sz_r1e, const size_t sz_c1b, const size_t sz_c1e) { uint32_t res = 0; const size_t sz_r0t = sz_r0e-sz_r0b; const size_t sz_r1t = sz_r1e-sz_r1b; const size_t sz_c0t = sz_c0e-sz_c0b; const size_t sz_c1t = sz_c1e-sz_c1b; if ((sz_c1t != sz_c0t) || (sz_r1t != sz_r0t)) return std::numeric_limits<double>::infinity(); const size_t sz_l0 = sz_r0*sz_c0; const size_t sz_l1 = sz_r1*sz_c1; const size_t rem = sz_r0t/16*16; for(size_t i=0;i<3; ++i) { for(size_t c=0; c<sz_c0t; ++c) { const size_t i0 = ((sz_c0b+c)*sz_r0+sz_r0b)+i*sz_l0; const size_t i1 = ((sz_c1b+c)*sz_r1+sz_r1b)+i*sz_l1; __m128i vsum = _mm_set1_epi32(0); for(size_t r=0; r<rem; r+=16) { const __m128i v0 = _mm_lddqu_si128((__m128i*)(src0+i0+r)); const __m128i v1 = _mm_lddqu_si128((__m128i*)(src1+i1+r)); const __m128i v2 = _mm_sad_epu8(v0, v1); vsum = _mm_add_epi32(vsum, v2); } vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 8)); vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 4)); res += _mm_cvtsi128_si32(vsum); for(size_t r=rem; r<sz_r0t; r++) { if (src0[i0+r] > src1[i1+r]) res += src0[i0+r]-src1[i1+r]; else res += src1[i1+r]-src0[i0+r]; } } } _mm_sfence(); return (double)res/(sz_c0t*sz_r0t*3); }
Это функция вычисляет mean(imabsdiff) двух одинаковых прямоугольников на двух картинках в формате матлаба. Цвета по отдельным слоям разложены, в слое по столбцам матрица расположена.
Получилось 80 mks на прямоугольниках 300×600 на АМД FX-8320.
И да могу сказать, зачем она мне понадобилась. В IPP и подобном есть уже подобное. Но ни в одной либе нет функции, что будет сразу считать норму для
Это к тому, что тут недавно вспоминали OpenCV и что нынче нафиг уже не нужно ручками оптимизировать.
45 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів