The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Релиз набора компиляторов LLVM 11.0 "
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Подсказка: Доступны два режима работы форума: "Раскрыть нити" и "Свернуть нити".
. "Релиз набора компиляторов LLVM 11.0 " +/
Сообщение от n00by (ok), 18-Окт-20, 08:38 
> Вероятно, она объявлена не static и visibilty для DSO оставлен по-умолчанию, что
> заставляет GCC допускать возможность переопределения функции в другом DSO.

Проверил гипотезу так:
объявил задействованные функции как static inline;
включил #include *.c с их определением в одну единицу трансляции, откуда происходит вызов;
добавил к -flto вот такое: -finline-limit=200000 --param inline-unit-growth=10000 -fwhole-program

Не инлайнит.

Clang инлайнит с -flto и без вышеуказанных манипуляций.


// сюда передаётся указатель на функцию, и отсюда осуществляется вызов.
/**
* \param painter       изменяет цвет вершин, либо NULL для раскрашивания в базовый цвет
*/
static inline
void poly_draw(const struct polygon *p, struct vec4 coordinate,
               fn_painter painter, struct color color, struct draw_ctx *restrict ctx);

// вот на что передаётся указатель
static inline __attribute__((always_inline))
void colorer(struct vertex *restrict vert, struct color src, unsigned i)
{
        if (!i) {
                vert->color = src;
        } else {
                vert->color.r = src.r * (1.0f + fsin(vert->pos.x + omega_bk + i));
                vert->color.g = src.g * (1.0f + fsin(vert->pos.y + omega_bk + i));
                vert->color.b = src.b * (1.0f + fsin(vert->pos.x + vert->pos.y + omega_bk + i));
                vert->color.a = src.a;
        }
}

// вызывавется так:
                        poly_draw(&square108, (struct vec4){ x, y, 0, dot_cnt },
                                  colorer, COLOR_BACKGROUND, ctx);


poly_draw() вызывается из нескольких мест мест с указателями на разные colorer-ы. Так что вроде-как есть причина, почему GCC считает, что инлайнить на надо. Но при этом Clang инлайнит единственный этот вызов poly_draw(), который по факту наиболее дорогой. В результате выигрывает по скорости вдвое. При этом с -O2 -flto размер исполняемого файла после strip у Clang 60720, у GCC - 69104 байт.

> Либо еще какие-то проблемы с опциями оптимизации.

Помимо вышеперечисленного добавил __attribute__((always_inline)) к poly_draw(). GCC заинлайнил (аналогично Clang-у -- только данный дорогой вызов). Стало быстрее на 20% по сравнению с прежним результатом GCC (60% от производительности Clang вместо прежних 50%), размер вырос до 77296. В общем, в данном случае для меня GCC не вариант.

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Релиз набора компиляторов LLVM 11.0 , opennews, 12-Окт-20, 22:53  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру