首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我是否最有效地使用了SSE资源?

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

Stack Overflow用户
提问于 2012-05-21 14:40:10
回答 1查看 277关注 0票数 0

我有这段代码来找出在低/高范围内有多少像素的key。低-高矩阵是从输入的大矩阵生成的。我必须输出匹配像素数大于150( 256)的低/高坐标。

代码语言:javascript
复制
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寄存器。我可以优化代码以利用所有寄存器吗?

EN

回答 1

Stack Overflow用户

发布于 2012-05-21 15:40:58

当涉及到优化时,不要在目标/生产环境中猜测、度量和度量。对于简单的算术,瓶颈通常在内存带宽上,因此您可以考虑在加载和保存之间执行其他操作。您还可以将循环重新排序并交错到以下位置,以减少到一个比较结果,而不是2个compare+merge结果:

代码语言:javascript
复制
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++)如上所述,一些编译器非常愚蠢,会生成在每个循环中计算地址的代码。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10680521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档