Re[2]: Bug report to MS
От: alex_public  
Дата: 12.03.17 15:40
Оценка: 6 (1) +2
Здравствуйте, Serg27, Вы писали:

S>Я не поленился и сделал bug report — connect.microsoft.com

S>Предмет бага — разный уровень оптимизации для очень близкого кода. Посланный код основан на rsdn
Автор: Serg27
Дата: 11.03.17


S>P.S.

S>Хотел бы еще раз отметить, что для этого вырожденного кода включение оптимизации в одном случае дает выигрыш в 27 раз, а в другом в 1.5. При идеальной же оптимизации выигрыш должен был быть в N_MULTIPLY = 1000000 раз. С этим не справился ни один компилятор...
S>P.P.S.
S>Самого кода пока не видно. Они декларируют задержку в появлении загруженных файлов от нескольких часов до суток.

Твой код некорректен в роли проверки быстродействия — никто тебе не гарантирует инлайн лямбд в таких ситуациях. Я то это использовал для краткости записи (проверив что это никак не влияет на цифры в моём конкретном случае). Но в твоём случае это абсолютно не известно. Далее, у тебя там используется ряд мест потенциально попадающих под разные оптимизации. В общем я бы на месте MS даже не стал бы рассматривать подобную бредятину, т.к. в ней не видно никаких очевидных ошибок. Если уж ты хотел сделать краткий код демонстрирующий суть проблемы, то это должно было бы выглядеть так:

#include <chrono>
#include <iostream>

using namespace std;

template<typename F> void Measure(F f)
{
    auto begin=chrono::high_resolution_clock::now();
    f();
    auto end=chrono::high_resolution_clock::now();
    cout<<chrono::duration_cast<chrono::milliseconds>(end-begin).count()<<" ms."<<endl;
}

constexpr auto N_MULTIPLY=10000000;
constexpr int N_GENERATED=1000;

float inputs[N_GENERATED];
float outputs[N_GENERATED];

void f1()
{
    for(int i=2; i<N_MULTIPLY; i++)
        for(int j=0; j<N_GENERATED; j++)
            outputs[j]=inputs[j]*i;
}

void f2()
{
    for(int i=2; i<N_MULTIPLY; i++){
        for(int j=0; j<N_GENERATED; j++)
            outputs[j]=inputs[j]*i;
        if(i==0) cout<<"msvc????????????????????";
    }
}

int main()
{
    Measure(f1);
    Measure(f2);
}


И результаты данного теста:
>gcc32-sse
815 ms.
815 ms.

>gcc32-avx
402 ms.
402 ms.

>gcc32-avx2
402 ms.
402 ms.

>msvc32-sse
2387 ms.
738 ms.

>msvc32-avx
2639 ms.
663 ms.

>msvc32-avx2
2640 ms.
660 ms.


Тут ключевой нюанс не в самих абсолютных цифрах или сравнение компиляторов, а в том, что данная программа собранная компилятором без откровенных багов должна выдавать одинаковые цифры при любых настройках оптимизации.

P.S. Да, при желание можешь заменить outputs[j]=inputs[j]*i; на скажем outputs[j]=inputs[j]*sin(0.1f*i); чтобы получить заявленную дикую разницу в 100 раз. Но это всё равно та же самая проблема, просто на sin она видна особо ярко. )))
Отредактировано 12.03.2017 16:31 alex_public . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.