我有一个简单的图像处理相关算法。简而言之,浮点数中的图像(均值)被8位图像减去,然后结果被保存到浮点数图像(Dest)
这个函数主要是由内部函数编写的。
我试着用TBB,parrallel_for来优化这个函数,但是我没有得到任何速度上的提升,只是得到了惩罚。
我该怎么做?我应该使用更多的底层方案,比如TBB任务来优化代码吗?
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);
}发布于 2011-02-10 16:46:30
在这里,相对于加载和存储的数量,您几乎没有进行任何计算,因此您可能受到内存带宽的限制,而不是计算。这就解释了为什么在优化计算时,您看不到吞吐量的任何改进。
不过,我会去掉_mm_prefetch指令--它们在这里几乎肯定无济于事,甚至可能会损害性能。
如果可能,您应该将此循环与您在此之前/之后所做的任何其他操作结合起来-这样您就可以在更多的计算中摊销内存I/O的成本。
https://stackoverflow.com/questions/4952932
复制相似问题