The OpenNET Project / Index page

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



Индекс форумов
Составление сообщения

Исходное сообщение
"Релиз набора компиляторов LLVM 11.0 "
Отправлено n00by, 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 не вариант.

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



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

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