С флагом -Ofast на g cc влияет ли разбивка математического выражения на скорость? - PullRequest
1 голос
/ 08 апреля 2020

Я хочу знать, является ли код

x += (a * b) + (c * d) + (e * f);

с флагом -Ofast на g cc быстрее / медленнее / таким же, как этот код:

x += a * b;
x += b * c;  
x += e * f;

У меня есть математическое выражение, подобное этому, во вложенном l oop, поэтому любое увеличение скорости может иметь существенный эффект.

1 Ответ

1 голос
/ 08 апреля 2020

Интуитивно, я бы ожидал, что они скомпилируются в один и тот же код. Но давайте посмотрим, что на самом деле происходит! Используя godbolt с вашей первой версией (однострочник), мы получаем этот код:

    mov     eax, DWORD PTR [rsp+20]
    mov     esi, DWORD PTR [rsp+28]
    imul    esi, DWORD PTR [rsp+32]
    imul    eax, DWORD PTR [rsp+24]
    lea     eax, [rax+rsi]
    mov     esi, DWORD PTR [rsp+36]
    imul    esi, DWORD PTR [rsp+40]
    add     esi, eax
    add     esi, DWORD PTR [rsp+44]
    mov     DWORD PTR [rsp+44], esi

С второй версией мы получаем это:

    mov     esi, DWORD PTR [rsp+28]
    imul    esi, DWORD PTR [rsp+32]
    mov     eax, DWORD PTR [rsp+20]
    imul    eax, DWORD PTR [rsp+24]
    add     eax, DWORD PTR [rsp+44]
    lea     eax, [rax+rsi]
    mov     esi, DWORD PTR [rsp+36]
    imul    esi, DWORD PTR [rsp+40]
    add     esi, eax
    mov     DWORD PTR [rsp+44], esi]

Это, я полагаю, одни и те же инструкции в несколько ином порядке. Я подозреваю, что производительность в этих двух случаях будет почти одинаковой, хотя, возможно, (?) Будет небольшая разница в производительности конвейера с одним по сравнению с другим.

Я подозреваю, что ваша первая версия здесь вполне подходит.

...