C 编译器优化此循环的奇怪行为
我写这段代码是为了找到热图像中的最高温度像素。我还需要知道图像中像素的坐标C 编译器优化此循环的奇怪行为,c,gcc,optimization,arm,C,Gcc,Optimization,Arm,我写这段代码是为了找到热图像中的最高温度像素。我还需要知道图像中像素的坐标 void _findMax(uint16_t* image, int sz, sPixelData* returnPixel) { int temp = 0; uint16_t max = image[0]; for(int i = 1; i < sz; i++) { if(max < image[i]) { max=i
void _findMax(uint16_t* image, int sz, sPixelData* returnPixel)
{
int temp = 0;
uint16_t max = image[0];
for(int i = 1; i < sz; i++)
{
if(max < image[i])
{
max=image[i];
//temp = i;
}
}
returnPixel->temperature = image[temp];
//returnPixel->x_location = temp % IMAGE_HORIZONTAL_SIZE;
//returnPixel->y_location = temp / IMAGE_HORIZONTAL_SIZE;
}
void\u findMax(uint16\u t*image,int sz,sPixelData*returnPixel)
{
内部温度=0;
uint16_t max=图像[0];
对于(int i=1;i温度=图像[温度];
//returnPixel->x_location=temp%图像水平大小;
//返回像素->y_位置=温度/图像水平尺寸;
}
注释掉三行后,函数将在大约2ms内执行。在未注释行的情况下,执行函数大约需要35毫秒
这似乎太过分了,因为除法和模在循环之后只执行一次
有没有关于如何加快这一进程的建议
或者,为什么要花这么长的时间来执行,而不是将模数除以不包括
这是在运行Linux的ARMA9处理器上执行的
我使用的编译器是ARMV8 32位Linux gcc编译器
我正在使用optimize-O3和以下编译选项:-march=armv7-a+neon-mcpu=cortex-a9-mfpu=neon-fp16-ftree矢量化。您的代码有缺陷。由于
temp
仅为0,编译器将生成仅执行returnPixel->temperature=image[0]的机器代码代码>很快就会完成。这里没有什么奇怪的
您应该将该行修改为:returnPixel->temperature=max代码>
使用霓虹灯可以显著提高性能。但这是另一个问题。如果不更新temp
,它总是0,并且函数只执行returnPixel->temperature=image[0]
。编译器正确地识别出循环是不需要的,并将其删除。是的,我知道这一点,我的问题是,当理论上循环执行后只需要一个额外的除法和模时,为什么函数要花这么长的时间来执行呢。循环只有额外的temp=i代码>,所以这只会导致它花费大约两倍的时间?不,这是两个完全不同的程序:一个带有循环(请参阅),另一个只包含三条汇编指令(请参阅)。为什么不使用neon?不是答案,如果你真的担心的话,使用register
修饰符将缩短运行时间。谢谢,我错过了这个,这是在听取了其他工程师的建议后编写的代码,我没有注意到这一点。原始代码返回像素->温度直接设置。谢谢