首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用TBB优化少指令(SSE2,SSE4)循环

用TBB优化少指令(SSE2,SSE4)循环
EN

Stack Overflow用户
提问于 2011-02-10 10:58:08
回答 1查看 1.5K关注 0票数 1

我有一个简单的图像处理相关算法。简而言之,浮点数中的图像(均值)被8位图像减去,然后结果被保存到浮点数图像(Dest)

这个函数主要是由内部函数编写的。

我试着用TBB,parrallel_for来优化这个函数,但是我没有得到任何速度上的提升,只是得到了惩罚。

我该怎么做?我应该使用更多的底层方案,比如TBB任务来优化代码吗?

代码语言:javascript
复制
float           *m, **m_data,
                *o, **o_data;
unsigned char   *p, **src_data;
register unsigned long len, i;
unsigned long   nr,
                nc;

src_data    =   src->UByteData;    // 2d array
m_data      =   mean->FloatData;   // 2d array
o_data      =   dest->FloatData;   // 2d array
nr          =   src->Rows;
nc          =   src->Cols;

__m128i xmm0;

for(i=0; i<nr; i++)
{
    m = m_data[i];
    o = o_data[i];
    p = src_data[i];
    len = nc;
    do
    {
        _mm_prefetch((const char *)(p + 16),  _MM_HINT_NTA);
        _mm_prefetch((const char *)(m + 16),  _MM_HINT_NTA);

        xmm0 = _mm_load_si128((__m128i *) (p));

        _mm_stream_ps(
                        o,
                        _mm_sub_ps(
                                    _mm_cvtepi32_ps(_mm_cvtepu8_epi32(_mm_srli_si128(xmm0, 0))),
                                    _mm_load_ps(m + offset)
                                )
                    );
        _mm_stream_ps(
                        o + 4,
                        _mm_sub_ps(
                                    _mm_cvtepi32_ps(_mm_cvtepu8_epi32(_mm_srli_si128(xmm0, 4))),
                                    _mm_load_ps(m + offset + 4)
                                )
                    );
        _mm_stream_ps(
                        o + 8,
                        _mm_sub_ps(
                                    _mm_cvtepi32_ps(_mm_cvtepu8_epi32(_mm_srli_si128(xmm0, 8))),
                                    _mm_load_ps(m + offset + 8)
                                )
                    );
        _mm_stream_ps(
                        o + 12,
                        _mm_sub_ps(
                                    _mm_cvtepi32_ps(_mm_cvtepu8_epi32(_mm_srli_si128(xmm0, 12))),
                                    _mm_load_ps(m + offset + 12)
                                )
                    );

        p += 16;
        m += 16;
        o += 16;
        len -= 16;
    }
    while(len);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-10 16:46:30

在这里,相对于加载和存储的数量,您几乎没有进行任何计算,因此您可能受到内存带宽的限制,而不是计算。这就解释了为什么在优化计算时,您看不到吞吐量的任何改进。

不过,我会去掉_mm_prefetch指令--它们在这里几乎肯定无济于事,甚至可能会损害性能。

如果可能,您应该将此循环与您在此之前/之后所做的任何其他操作结合起来-这样您就可以在更多的计算中摊销内存I/O的成本。

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

https://stackoverflow.com/questions/4952932

复制
相关文章

相似问题

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