0

キーのピクセル数が低/高範囲にあることを見つけるためのこのコードがあります。ローハイ マトリックスは、入力ビッグ マトリックスから生成されます。一致するピクセルの数が 150 (256) を超える場合、低/高の座標を出力する必要があります。

int8_t high[8192][8192];
int8_t low[8192][8192];
int8_t key[16][16]

for (int i = 0; i <= 8192 - 16; i++)
for (int j = 0; j <= 8192 - 16; j++)
{
    char *kLoc = key[ii];
    char *lLoc = low[i + ii] + j;
    char *hLoc = high[i + ii] + j;

    __m128i high, low, num;
    low = _mm_loadu_si128((__m128i*)lLoc);
    high = _mm_loadu_si128((__m128i*)hLoc);
    num = _mm_loadu_si128((__m128i*)kLoc);

    // Snip
}

これを改善できますか?

8 つの 128 ビット XMM レジスターと MMX レジスターがあることは理解していますが、使用可能な XMM レジスターは 3 つしか使用していません。すべてのレジスタを利用するようにコードを最適化できますか?

4

1 に答える 1

-1

最適化に関しては、ターゲット/本番環境で推測、測定、および測定しないでください。単純な演算の場合、ボトルネックは通常メモリ帯域幅にあるため、ロードと保存の間に他のことを行うことを検討してください。ループを次のように並べ替えてインターリーブすることにより、2つのcompare+merge結果ではなく1つのcompareに減らすこともできます。

num_1  = loadu(hLoc); hLoc++;
num_2  = loadu(hLoc); hLoc++;
low_1  = loadu(kLoc); kLoc++;
low_2  = loadu(kLoc); kLoc++;
high_1 = loadu(lLoc); lLoc++;
high_2 = loadu(lLoc); lLoc++;

num1   = mm_sub(low1)
num2   = mm_sub(low2)
cmp num1, high1
cmp num2, high2

store num1
store num2

また、kLoc、lLoc、hLocをループの外に移動し、上記のようにインクリメント(つまり、kLoc ++)を実行することもできます。一部のコンパイラは非常に愚かで、すべてのループでアドレスを計算するコードを生成します。

于 2012-05-21T07:40:57.687 に答える