Здравствуйте, 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 она видна особо ярко. )))