【发布时间】:2014-10-16 16:42:21
【问题描述】:
我正在尝试优化以下功能: (基本上就是取一行 32bit Ints,将每个 int 复制到一个更大的目标数组中,然后复制每一行
for(int i = 0; i < numLines; i++)
{
pStartOfLine = pDest;
for(int j = 0; j < intsPerLineSrc; j++)
{
*pDest = *pSrc; // copy pixel A to FullSizeBuffer A
pDest++; // Move dest Ptr to next Pixel
*pDest = *pSrc; // Copy pixel A to FullsizeBuffer AGAIN
pDest++; // Move Src and Dst Pointrs to next pixels
pSrc++;
}
memcpy(pDest, pStartOfLine, (8*intsPerLineSrc) ); // Duplicate the Line written to pDest, to next line of pDest.
pDest = pDest + (2*intsPerLineSrc); // move pDest to Start of Next Line
}
有效地将图像缩放至 2 * 它在两个维度上的原始大小。 现在这让我觉得这应该从 SIMD 中受益匪浅,但是我似乎找不到正确的内在指令集来帮助我在这种特定情况下。
有人愿意帮助我吗? 或者我会在这样一个简单的操作中总是受到内存限制,以至于在 SIMD 中重构是一种浪费?
是的,这部分代码最终会在多个线程中运行,因此它已经是多线程的,但我认为 SIMD 优化可能会更有帮助。
干杯,任何帮助/建议,
詹姆斯
【问题讨论】:
-
你真的看过编译器产生了什么吗?
-
也许我应该添加我正在将高清图像缩放为 4K 图像,并且目标缓冲区为 32Mb。我当前的代码在我当前的测试机器上大约是 3-4 毫秒,(双 nahalem xeon)现在看起来我已经接近最佳理论性能.....
-
不,我还没有查看编译器生成的内容,是的,我应该这样做。不知道怎么做,猜猜我接下来会学习……为小费干杯。
-
这样的声音会受到内存限制。无论如何,
_mm_shuffle_epi32()可能就是您要找的。加载 64 位、随机播放、存储 128 位。 -
运行
gcc -S <normal options> mycode.c,你会得到一个mycode.s
标签: c++ arrays image-processing optimization sse