我有这段代码可以找到关键字的像素位于低/高范围内。 从输入大矩阵生成低 - 高矩阵。我必须输出低/高的坐标,其中匹配像素的数量大于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寄存器,而我只使用3个可用的XMM寄存器。我可以优化代码以使用所有寄存器吗?
答案 0 :(得分:-1)
在进行优化时,不要猜测,测量和测量目标/生产环境。对于简单的算术,瓶颈通常是在内存带宽上,所以你可以考虑在加载和保存之间做其他事情。通过重新排序并将循环交错为:
,您也可以减少到一个比较而不是2个比较+合并结果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 ++),某些编译器如此愚蠢并生成用于计算每个循环中地址的代码。