これは、私が投稿する最初の SO 質問になります。
std::cout << "Hello mighty StackOverflow!" << std::endl;
Intel の SSE4.2 および/または AVX 組み込み関数を使用して、ステレオ ビジョン アプリケーションの「ブロック マッチング」実装を最適化しようとしています。「Sum of Absolute Differences」を使用して、最も一致するブロックを見つけています。私の場合、3 や 5 などの奇数blockSize
になります。これは私の C++ コードのスニペットです。
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
minS = INT_MAX;
for (int k = 0; k <= beta; ++k) {
S = 0;
for (int l = i; l < i + blockSize; ++l) {
for (int m = j; m <= j + blockSize ; ++m) {
// adiff(a,b) === abs(a-b)
S += adiff(rImage.at<uchar>(l, m), lImage.at<uchar>(l, m + k));
}
}
if (S < minS) {
minS = S;
kStar = k;
}
}
disparity.at<uchar>(i, j) = kStar;
}
}
_mm_mpsadbw_epu8
ストリーミング SIMD 拡張命令には、や などの SAD を使用したブロック マッチングを容易にする多くの命令が含まれていることを知っています_mm_sad_epu8
が、それらはすべて 4、16 blockSize
、または 32 の s をターゲットにしています。たとえば、Intel のこのコードです。私の問題は、私のアプリケーションblockSize
では奇数であり、ほとんどが 3 または 5 であることです。
次の出発点を検討しました。
r0 = _mm_lddqu_si128 ((__m128i*)&rImage.at<uchar>(i, j));
l0 = _mm_lddqu_si128 ((__m128i*)&lImage.at<uchar>(i, j));
s0 = _mm_abs_epi8 (_mm_sub_epi8 (r0 , l0) );
しかし、ここからs0
!
これについて何か考えていただければ幸いです。