The OpenNET Project / Index page

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



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Влияние несущественных изменений кода на производительность ..., opennews (??), 09-Окт-18, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


16. "Влияние несущественных изменений кода на производительность ..."  –1 +/
Сообщение от Акакжев (?), 09-Окт-18, 12:53 
Теория:

-O turns on the following optimization flags:
...
-fomit-frame-pointer

Практика:

0xffffffff817929e0 <+0>: push   %rbp
...
0xffffffff817929ee <+14>: pop    %rbp
0xffffffff817929ef <+15>: retq  

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

21. "Влияние несущественных изменений кода на производительность ..."  –1 +/
Сообщение от Аноним (21), 09-Окт-18, 13:34 
Данной оптимизация отключена, поскольку обратная опция находится в зависимостях других опций вроде C++ исключений. Без которых GCC не может сгенерировать рабочий код. Доходит до абсурда когда stack-frame создаётся в абсолютно пустых функциях.
Ответить | Правка | Наверх | Cообщить модератору

31. "Влияние несущественных изменений кода на производительность ..."  +/
Сообщение от Акакжев (?), 09-Окт-18, 14:37 
> Данной оптимизация отключена, поскольку обратная опция находится в зависимостях других
> опций вроде C++ исключений. Без которых GCC не может сгенерировать рабочий
> код.

По поводу "других" в документации сказано: Omit the frame pointer in functions that don't need one.

make V=1 показывает, что fomit-frame-pointer передаётся компилятору.
Пример навскидку.


void cyc2ns_read_begin(struct cyc2ns_data *data)
{
        int seq, idx;

        preempt_disable_notrace();

        do {
                seq = this_cpu_read(cyc2ns.seq.sequence);
                idx = seq & 1;

                data->cyc2ns_offset = this_cpu_read(cyc2ns.data[idx].cyc2ns_offset);
                data->cyc2ns_mul    = this_cpu_read(cyc2ns.data[idx].cyc2ns_mul);
                data->cyc2ns_shift  = this_cpu_read(cyc2ns.data[idx].cyc2ns_shift);

        } while (unlikely(seq != this_cpu_read(cyc2ns.seq.sequence)));
}

void cyc2ns_read_end(void)
{
        preempt_enable_notrace();
}


Прошу прощения, если кому непривычен формат,
отсутствие фреймов видно:

.text:0000000000000228 cyc2ns_read_begin proc near
.text:0000000000000228                 inc     gs:__preempt_count
.text:000000000000022F                 mov     rsi, offset cyc2ns
.text:0000000000000236 loc_236:
.text:0000000000000236                 mov     edx, dword ptr gs:cyc2ns+20h
.text:000000000000023D                 mov     eax, edx
.text:000000000000023F                 and     eax, 1
.text:0000000000000242                 shl     rax, 4
.text:0000000000000246                 add     rax, rsi
.text:0000000000000249                 mov     rcx, gs:[rax+8]
.text:000000000000024E                 mov     [rdi+8], rcx
.text:0000000000000252                 mov     ecx, gs:[rax]
.text:0000000000000255                 mov     [rdi], ecx
.text:0000000000000257                 mov     eax, gs:[rax+4]
.text:000000000000025B                 mov     [rdi+4], eax
.text:000000000000025E                 mov     eax, dword ptr gs:cyc2ns+20h
.text:0000000000000265                 cmp     edx, eax
.text:0000000000000267                 jnz     short loc_236
.text:0000000000000269                 retn
.text:0000000000000269 cyc2ns_read_begin endp


.text:000000000000026A cyc2ns_read_end proc near
.text:000000000000026A                 dec     gs:__preempt_count
.text:0000000000000271                 jnz     short locret_278
.text:0000000000000273                 call    ___preempt_schedule_notrace
.text:0000000000000278 locret_278:
.text:0000000000000278                 retn
.text:0000000000000278 cyc2ns_read_end endp
.text:0000000000000278


Можно предположить, что собирали там с опцией CONFIG_FRAME_POINTER.

grep -C2 frame-pointer Makefile

HOSTCFLAGS   := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 \
                -fomit-frame-pointer -std=gnu89 $(HOST_LFS_CFLAGS)

--
ifdef CONFIG_FRAME_POINTER
KBUILD_CFLAGS   += -fno-omit-frame-pointer -fno-optimize-sibling-calls
else
# Some targets (ARM with Thumb2, for example), can't be built with frame
# pointers.  For those, we don't have FUNCTION_TRACER automatically
# select FRAME_POINTER.  However, FUNCTION_TRACER adds -pg, and this is
# incompatible with -fomit-frame-pointer with current GCC, so we don't use
# -fomit-frame-pointer with FUNCTION_TRACER.
ifndef CONFIG_FUNCTION_TRACER
KBUILD_CFLAGS   += -fomit-frame-pointer
endif
endif

В таком случае, возникает вопрос: влияет ли она на эффект от inline?
Ответить | Правка | Наверх | Cообщить модератору

59. "Влияние несущественных изменений кода на производительность ..."  –1 +/
Сообщение от Himik (ok), 10-Окт-18, 19:26 
push %rbp и pop %rbp не имеют ни какого отношения к стеку, это просто сохранение регистра для использования в вычислениях функции. Раньше rbp использовался для буфера в стеке, теперь нет.
Ответить | Правка | К родителю #21 | Наверх | Cообщить модератору

64. "Влияние несущественных изменений кода на производительность ..."  +/
Сообщение от Акакжев (?), 11-Окт-18, 08:32 
> push %rbp и pop %rbp не имеют ни какого отношения к стеку,
> это просто сохранение регистра для использования в вычислениях функции. Раньше rbp
> использовался для буфера в стеке, теперь нет.

Вот подпрограмма целиком:


0xffffffff817929e0 <+0>: push   %rbp
0xffffffff817929e1 <+1>: mov    $0x14080c0,%esi
0xffffffff817929e6 <+6>: mov    %rsp,%rbp
0xffffffff817929e9 <+9>: callq  0xffffffff8125d590 <__kmalloc>
0xffffffff817929ee <+14>: pop    %rbp
0xffffffff817929ef <+15>: retq  

mov    %rsp,%rbp — формирование фрейма, который не используется.
Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




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

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