gpt4 book ai didi

c - 如何分析/识别紧密处理循环中的缓慢步骤?

转载 作者:太空宇宙 更新时间:2023-11-03 23:03:15 28 4
gpt4 key购买 nike

我有一些专有的图像处理代码。它遍历图像并计算图像的一些统计数据。下面是我正在谈论的那种代码的示例,尽管这不是需要优化的算法。

我的问题是,有哪些工具可以分析这些类型的紧密循环,以确定哪些地方运行缓慢? Sleepy,Windows Performance Analyzer 都更专注于识别哪些方法/函数速度慢。我已经知道哪个功能慢了,我只需要弄清楚如何优化它。

void BGR2YUV(IplImage* bgrImg, IplImage* yuvImg)
{
const int height = bgrImg->height;
const int width = bgrImg->width;
const int step = bgrImg->widthStep;
const int channels = bgrImg->nChannels;

assert(channels == 3);
assert(bgrImg->height == yuvImg->height);
assert(bgrImg->width == yuvImg->width);
// for reasons that are not clear to me, these are not the same.
// Code below has been modified to reflect this fact, but if they
// could be the same, the code below gets sped up a bit.
// assert(bgrImg->widthStep == yuvImg->widthStep);
assert(bgrImg->nChannels == yuvImg->nChannels);

const uchar* bgr = (uchar*) bgrImg->imageData;
uchar* yuv = (uchar*) yuvImg->imageData;

for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
const int ixBGR = i*step+j*channels;
const int b = (int) bgr[ixBGR+0];
const int g = (int) bgr[ixBGR+1];
const int r = (int) bgr[ixBGR+2];

const int y = (int) (0.299 * r + 0.587 * g + 0.114 * b);
const double di = 0.596 * r - 0.274 * g - 0.322 * b;
const double dq = 0.211 * r - 0.523 * g + 0.312 * b;
// Do some shifting and trimming to get i & q to fit into uchars.
const int iv = (int) (128 + max(-128.0, min(127.0, di)));
const int q = (int) (128 + max(-128.0, min(127.0, dq)));

const int ixYUV = i*yuvImg->widthStep + j*channels;
yuv[ixYUV+0] = (uchar)y;
yuv[ixYUV+1] = (uchar)iv;
yuv[ixYUV+2] = (uchar)q;
}
}
}

最佳答案

由于您无法共享代码,我有一些一般性建议。首先要记住分析器会告诉你代码的哪一部分花费了更多的时间,更高级的分析器可以建议一些修改以提高速度。但总的来说,算法优化比调整代码获得的速度要快得多。对于您共享的示例代码,如果您用谷歌搜索高效或快速的 RGB 到 YUV 转换,您会发现大量方法(从使用查找表到 SSE2 和 GPU 利用率)可以显着提高速度,我敢肯定没有任何分析器可以建议其中任何一个。

因此,一旦您知道该方法的哪一部分速度较慢,您就可以按照以下两个步骤操作:

  1. 算法优化:了解算法在做什么,并尝试提出更优化的算法。谷歌是你的 friend ,很可能有人已经考虑过优化该算法并与全世界分享了想法/代码。通过,通常你应该考虑你所拥有的限制。例如,加快代码速度的最简单但最有效的图像处理方法是将图像的大小减小到尽可能小。一个好的经验法则是质疑代码/算法中的每一个假设。例如,是否需要处理 800x600 的图像?或者可以在不影响准确性的情况下将尺寸减小到 320x240?是否需要处理三 channel 图像?或者同样可以用灰度图像来实现?我想你应该已经明白了。

  2. 实现优化:一些高级分析工具可以建议如何调整代码,您可以尝试找到一个负担得起的工具。有些人可能不同意,但我认为没有必要使用这样的工具。通常不需要图像处理精确值,例如可以使用整数对滤波器响应的粗略近似,而不是双 float 的精确计算。 SIMD 指令和最近的 GPU 已被证明非常适合优化图像处理方法。如果可能的话,你应该考虑一下。你总是可以谷歌如何优化循环或一些特定的操作。毕竟你能做的就是完成了,一种可能性是将你的代码分解成更小的逻辑片段并改变它,这样算法或方法就不会通过共享这些片段而暴露出来。然后你可以在 SO 上分享每个片段,并询问其他人对如何优化它的意见。

关于c - 如何分析/识别紧密处理循环中的缓慢步骤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10501295/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com