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
修饰符将缩短运行时间。谢谢,我错过了这个,这是在听取了其他工程师的建议后编写的代码,我没有注意到这一点。原始代码返回像素->温度直接设置。谢谢