Как сказать Clang оптимизировать с определенным уровнем - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть следующий код для рисования круга в данном буфере:

void drawcircle(int x, int y, int radius, void* buffer, int width, int height)
{       
    int radiusSq = radius * radius;
    for (int yy = -radius; yy <= radius; ++yy)
    {
        for (int xx = -radius; xx <= radius; ++xx)
        {
            if (xx * xx + yy * yy < radiusSq + radius)
            {
                //This if-statement destroys performance in Os and O0.
                if (x + xx >= 0 && y + yy >= 0 && x + xx <= width && y + yy <= height)
                {
                    set_pixel(x + xx, y + yy);
                }
            }
        }
    }
}

В Xcode флаги по умолчанию: -O0 для отладки -Os для выпуска

При запуске кода выше для clang с -Os или -O1`, функции требуется 6 с, чтобы нарисовать 100 000 кругов радиуса 100.

Если вместо этого я включу -O2, она будет выполняться за 40 нс, а 29 нс сO3. Это огромная разница.

Только для этой функции я хочу включить O2 или O3. Я столкнулся со следующим синтаксисом:

[[gnu::optimize(O2)]], [[gnu::optimize("O3")]], [[clang::optimize(optnone)]], __attribute((optimize(O3)))__ где-то.

Если я укажу что-либо, кроме optnone атрибут optimizeигнорируется (O0 также игнорируется) ..

Любые идеи, как я могу сказать, чтобы оптимизировать эту функцию только с указанным уровнем?

...