我是否最有效地使用 SSE 资源

Am I using the SSE resources most efficiently?

本文关键字:SSE 资源 有效地 是否      更新时间:2023-10-16

我有这段代码来查找键在低/高范围内有多少像素。低-高矩阵由输入大矩阵生成。我必须输出匹配像素数大于 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 寄存器。我可以优化代码以利用所有寄存器吗?

优化方面,不要猜测、测量和测量目标/生产环境。对于简单的算术,瓶颈通常在于内存带宽,因此您可以考虑在加载和保存之间执行其他操作。您还可以通过将循环重新排序和交错到:

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++(,如上所述,一些编译器如此愚蠢并生成计算每个循环中地址的代码。