Re: vs2012 , ошибка оптимизатора?
От: Аноним  
Дата: 14.04.14 18:00
Оценка: +1 -2 :)
Здравствуйте, Chorkov, Вы писали:

C>Здравствуйте,

C>Подозреваю, что нашел ошибку компилятора.
Сравнивать даблы по значению нельзя.
Re[3]: vs2012 , ошибка оптимизатора?
От: Аноним  
Дата: 14.04.14 19:00
Оценка: -2
Здравствуйте, glap, Вы писали:

C>>>Подозреваю, что нашел ошибку компилятора.

А>>Сравнивать даблы по значению нельзя.

G>В данном случае можно.


Нельзя никогда, если два дабла получены в результате вычислений. Умножение на минус единицу ничем в этом плане не отличается.
vs2012 , ошибка оптимизатора?
От: Chorkov Россия  
Дата: 14.04.14 16:38
Оценка: 66 (1)
Здравствуйте,
Подозреваю, что нашел ошибку компилятора.
Проявляется в релизе на 2012-я студии (17.00.61030).

#include <iostream>

void foo(size_t size, const double * J, double * omega)
{
    for( size_t i=0; i<size; ++i )
        omega[i] = - J[ i*(size+1) ]; // если без минуса, то все работает нормально.
}

int main(int argc, char *argv[])
{
    const size_t size=6;
    double J[size*size] = {
        11.,12.,13.,14.,15.,16.,
        21.,22.,23.,24.,25.,26.,
        31.,32.,33.,34.,35.,36.,
        41.,42.,43.,44.,45.,46.,
        51.,52.,53.,54.,55.,56.,
        61.,62.,63.,64.,65.,66.,
        };

    double omega[size] ={0};

    foo(size, J, omega);

    for(size_t i=0; i< size; ++i)
        if( omega[i] != -J[i*(size+1)] )
            std::cout<< "Error!!! : i="<<i<<" omega=" << omega[i]  << " -J=" << -J[i*(size+1)] << std::endl;

    return 0;
}



15.04.14 12:10: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Re[4]: vs2012 , ошибка оптимизатора?
От: pentagra  
Дата: 15.04.14 14:43
Оценка: 16 (1)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Уважаемые коллеги, давайте сделаем единообразные тесты на доступных компиляторах (VS10, 11, 12), для отправки bug reprort.


MSVC 2013
  Вывод
x64 Cross
D:\work\temp\1>cl
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

D:\work\temp\1>cl -Od main.cpp   1>>out.txt 2>err.txt

D:\work\temp\1>main.exe
size=100
total errors=0

D:\work\temp\1>del main.obj

D:\work\temp\1>del main.exe

D:\work\temp\1>cl -O2 main.cpp   1>>out.txt 2>err.txt

D:\work\temp\1>main.exe
size=100
i=1 x=1101 y=1001
i=3 x=1303 y=1203
i=5 x=1505 y=1405
i=7 x=1707 y=1607
total errors=50


x64 Native
D:\work\temp\1>cl
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

D:\work\temp\1>cl -Od main.cpp   1>>out.txt 2>err.txt

D:\work\temp\1>main.exe
size=100
total errors=0

D:\work\temp\1>del main.obj

D:\work\temp\1>del main.exe

D:\work\temp\1>cl -O2 main.cpp   1>>out.txt 2>err.txt

D:\work\temp\1>main.exe
size=100
i=1 x=1101 y=1001
i=3 x=1303 y=1203
i=5 x=1505 y=1405
i=7 x=1707 y=1607
total errors=50


x86 Native
D:\work\temp\1>cl
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

D:\work\temp\1>cl -Od main.cpp   1>>out.txt 2>err.txt

D:\work\temp\1>main.exe
size=100
total errors=0

D:\work\temp\1>del main.obj

D:\work\temp\1>del main.exe

D:\work\temp\1>cl -O2 main.cpp   1>>out.txt 2>err.txt

D:\work\temp\1>main.exe
size=100
i=1 x=1101 y=1001
i=3 x=1303 y=1203
i=5 x=1505 y=1405
i=7 x=1707 y=1607
total errors=50
Re[3]: vs2012 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 15.04.14 14:04
Оценка: 15 (1)
К>>На 17.00.50727.1 не воспроизвелась.
К>Опа! Воспроизвелось.
К>Что-то я не понимаю. Только что не воспроизводилось... всего-то, компьютер перезагрузил.
К>Итак, VS2010 — не воспроизводится, 2012 — воспроизводится, причём для разных платформ по-разному
К>amd64 и x86_amd64 — ошибки в i=1, 3; x86 — i=1, 3, 5.

Уважаемые коллеги, давайте сделаем единообразные тесты на доступных компиляторах (VS10, 11, 12), для отправки bug reprort.
main.cpp:
#include <iostream>
#include <iterator>
#include <numeric>
using namespace std;

__forceinline
size_t index(size_t i, size_t size)
{
    return i*(size+1);
}

__declspec(noinline) // affects bug
void foo(size_t size, const double * const X, double * const Y)
{
    for(size_t i=0; i!=size; ++i) // replacing size_t with unsigned affects bug
        Y[i] = -X[index(i, size)]; // negation affects bug
}

int main()
{
    const size_t size = 100;
    cout << "size=" << size << endl;
    
    double X[size*size], Y[size];
    iota(begin(X), end(X), 1000.);

    foo(size, X, Y);

    size_t errors = 0;
    for(size_t i=0; i!=size; ++i)
    {
        const double x = X[index(i, size)], y = -Y[i];
        if(x != y)
        {
            ++errors;
            if(errors < 5)
                cout << "i=" << i
                     << " x=" << x << " y=" << y << endl;
        }
    }
    cout << "total errors=" << errors << endl;
}

test.cmd:
cl
cl -Od main.cpp >> out.txt 2> err.txt
main.exe
del main.exe
cl -O2 main.cpp >> out.txt 2> err.txt
main.exe
del main.exe

  Вывод
MSVC2010 x32:
C:\vs2012_fp_bug>test.cmd

C:\vs2012_fp_bug>cl
Оптимизирующий 32-разрядный компилятор Microsoft (R) C/C++ версии 16.00.40219.01 для 80x86
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

использование: cl [ параметр... ] имя_файла... [ /link параметр_компоновки... ]

C:\vs2012_fp_bug>cl -Od main.cpp  1>>out.txt 2>err.txt

C:\vs2012_fp_bug>main.exe
size=100
total errors=0

C:\vs2012_fp_bug>del main.exe

C:\vs2012_fp_bug>cl -O2 main.cpp  1>>out.txt 2>err.txt

C:\vs2012_fp_bug>main.exe
size=100
total errors=0

C:\vs2012_fp_bug>del main.exe

MSVC2010 x64:
C:\vs2012_fp_bug>test.cmd

C:\vs2012_fp_bug>cl
Оптимизирующий компилятор Microsoft (R) C/C++ версии 16.00.40219.01 для x64
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

использование: cl [ параметр... ] имя_файла... [ /link параметр_компоновки... ]

C:\vs2012_fp_bug>cl -Od main.cpp  1>>out.txt 2>err.txt

C:\vs2012_fp_bug>main.exe
size=100
total errors=0

C:\vs2012_fp_bug>del main.exe

C:\vs2012_fp_bug>cl -O2 main.cpp  1>>out.txt 2>err.txt

C:\vs2012_fp_bug>main.exe
size=100
total errors=0

C:\vs2012_fp_bug>del main.exe

MSVC2012 x32:
C:\vs2012_fp_bug>test.cmd

C:\vs2012_fp_bug>cl
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.50727.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

C:\vs2012_fp_bug>cl -Od main.cpp  1>>out.txt 2>err.txt

C:\vs2012_fp_bug>main.exe
size=100
total errors=0

C:\vs2012_fp_bug>del main.exe

C:\vs2012_fp_bug>cl -O2 main.cpp  1>>out.txt 2>err.txt

C:\vs2012_fp_bug>main.exe
size=100
i=1 x=1101 y=1001
i=3 x=1303 y=1203
i=5 x=1505 y=1405
i=7 x=1707 y=1607
total errors=50

C:\vs2012_fp_bug>del main.exe

MSVC2012 x64:
C:\vs2012_fp_bug>test.cmd

C:\vs2012_fp_bug>cl
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.50727.1 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

C:\vs2012_fp_bug>cl -Od main.cpp  1>>out.txt 2>err.txt

C:\vs2012_fp_bug>main.exe
size=100
total errors=0

C:\vs2012_fp_bug>del main.exe

C:\vs2012_fp_bug>cl -O2 main.cpp  1>>out.txt 2>err.txt

C:\vs2012_fp_bug>main.exe
size=100
i=1 x=1101 y=1001
i=3 x=1303 y=1203
i=5 x=1505 y=1405
i=7 x=1707 y=1607
total errors=50

C:\vs2012_fp_bug>del main.exe
Re[5]: vs2012 , ошибка оптимизатора?
От: ArtDenis Россия  
Дата: 15.04.14 02:37
Оценка: 14 (1)
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>2. Это VS2012(причём не обновлённый), а уже есть VS2013, которого у меня нет под рукой. Нужно в первую очередь проверить на VS2013.


На VS2013 не проявляется.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[6]: vs2012 , ошибка оптимизатора?
От: Аноним  
Дата: 15.04.14 02:44
Оценка: 14 (1)
Здравствуйте, ArtDenis, Вы писали:

AD>Здравствуйте, Evgeny.Panasyuk, Вы писали:


EP>>2. Это VS2012(причём не обновлённый), а уже есть VS2013, которого у меня нет под рукой. Нужно в первую очередь проверить на VS2013.


AD>На VS2013 не проявляется.


Проявляется

+> cl vs.cpp /O2
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x64
Copyright (C) Microsoft Corporation. All rights reserved.

vs.cpp
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\xlocale(337) : warning C4530: C++ exception handler used, but unwind semantics are not
enabled. Specify /EHsc
Microsoft (R) Incremental Linker Version 12.00.21005.1
Copyright (C) Microsoft Corporation. All rights reserved.

/out:vs.exe
vs.obj

+> vs
i=1 Y=-1001 X=1005
Re: vs2012 , ошибка оптимизатора?
От: Кодт Россия  
Дата: 15.04.14 08:25
Оценка: 14 (1)
Здравствуйте, Chorkov, Вы писали:

C>Подозреваю, что нашел ошибку компилятора.

C>Проявляется в релизе на 2012-я студии (17.00.61030).

На 17.00.50727.1 не воспроизвелась.
Перепробовал платформы x86, x86_amd64, amd64 и опции /O2, /Oy

На VS2010, кстати, тоже не воспроизвелась.

Пожалуйста, укажи командную строку полностью.
Перекуём баги на фичи!
Re[2]: vs2012 , ошибка оптимизатора?
От: Chorkov Россия  
Дата: 15.04.14 08:36
Оценка: 14 (1)
Здравствуйте, Кодт, Вы писали:

К>Пожалуйста, укажи командную строку полностью.


x64:
D:\WB\tests\test_msvc_o2>cl -O2 main.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.61030 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xlocale(336) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
Microsoft (R) Incremental Linker Version 11.00.61030.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:main.exe
main.obj

D:\WB\tests\test_msvc_o2>main.exe
Error!!! : i=1 omega=-12 -J=-22
Error!!! : i=3 omega=-34 -J=-44


x86 — тоже самое
D:\WB\tests\test_msvc_o2>cl -O2 main.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.61030 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xlocale(336) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
Microsoft (R) Incremental Linker Version 11.00.61030.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:main.exe
main.obj

D:\WB\tests\test_msvc_o2>main.exe
Error!!! : i=1 omega=-12 -J=-22
Error!!! : i=3 omega=-34 -J=-44
Error!!! : i=5 omega=-56 -J=-66
Re[2]: vs2012 , ошибка оптимизатора?
От: Кодт Россия  
Дата: 15.04.14 09:28
Оценка: 14 (1)
Здравствуйте, Кодт, Вы писали:

К>На 17.00.50727.1 не воспроизвелась.


Опа! Воспроизвелось.
Что-то я не понимаю. Только что не воспроизводилось... всего-то, компьютер перезагрузил.

Итак, VS2010 — не воспроизводится, 2012 — воспроизводится, причём для разных платформ по-разному
amd64 и x86_amd64 — ошибки в i=1, 3; x86 — i=1, 3, 5.
Перекуём баги на фичи!
Re: vs2012 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 14.04.14 18:28
Оценка: +1
Здравствуйте, Chorkov, Вы писали:

C>Подозреваю, что нашел ошибку компилятора.


Сделай минимальный пример воспроизводящий ошибку, убери лишний шум — желающих помочь будет больше.
На каких уровнях оптимизации /O? проявляется?

C>Проявляется в релизе на 2012-я студии (17.00.61030).


В VS2012 где-то был баг, связанный с floating point — здесь как-то проскакивала подобная тема.
Re: vs2012 , ошибка оптимизатора?
От: ArtDenis Россия  
Дата: 14.04.14 17:50
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>Здравствуйте,

C>Подозреваю, что нашел ошибку компилятора.

А что программа выдаёт-то в итоге?
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: vs2012 , ошибка оптимизатора?
От: glap  
Дата: 14.04.14 18:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Chorkov, Вы писали:


C>>Здравствуйте,

C>>Подозреваю, что нашел ошибку компилятора.
А>Сравнивать даблы по значению нельзя.

В данном случае можно.
Re: vs2012 , ошибка оптимизатора?
От: ononim  
Дата: 14.04.14 19:09
Оценка:
стандартный же баян
Как много веселых ребят, и все делают велосипед...
Re: vs2012 , ошибка оптимизатора?
От: Chorkov Россия  
Дата: 14.04.14 19:57
Оценка:
Здравствуйте, Я писал:

  Скрытый текст
#include <iostream>

void foo(size_t size, const double * J, double * omega)
{
    for( size_t i=0; i<size; ++i )
        omega[i] = - J[ i*(size+1) ]; // если без минуса, то все работает нормально.
}

int main(int argc, char *argv[])
{
    const size_t size=6;
    double J[size*size] = {
        11.,12.,13.,14.,15.,16.,
        21.,22.,23.,24.,25.,26.,
        31.,32.,33.,34.,35.,36.,
        41.,42.,43.,44.,45.,46.,
        51.,52.,53.,54.,55.,56.,
        61.,62.,63.,64.,65.,66.,
        };

    double omega[size] ={0};

    foo(size, J, omega);

    for(size_t i=0; i< size; ++i)
        if( omega[i] != -J[i*(size+1)] )
            std::cout<< "Error!!! : i="<<i<<" omega=" << omega[i]  << " -J=" << -J[i*(size+1)] << std::endl;

    return 0;
}


Собственно это и есть минимальный пример воспроизводящий ошибку.
Перекладываем диагональные элементы матрицы с умножением на -1.
Вывод программы:
Error!!! : i=1 omega=-12 -J=-22
Error!!! : i=3 omega=-34 -J=-44
Error!!! : i=5 omega=-56 -J=-66

Проявляется при оптимизации -O2. (-O1 — ошибки нет, но у меня производительность критична.)
При убирании '-' в цикле в foo — ошибка пропадает.
При удалении добавлении любого дополнительного кода внутрь цикла в foo, тое пропадает.
Поэтому и грешу на оптимизатор.

Про сравнение чисел с плавающей точкой я знаю. Оператор == появился при сублимировании кода.
Re[4]: vs2012 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 14.04.14 20:13
Оценка:
Здравствуйте, Аноним, Вы писали:

C>>>>Подозреваю, что нашел ошибку компилятора.

А>>>Сравнивать даблы по значению нельзя.
G>>В данном случае можно.
А>Нельзя никогда, если два дабла получены в результате вычислений.

Это всего лишь rule of dumb, подходящий для 99% случаев.
В общем случае их можно сравнивать. Особенно когда работа с такими числами регламентирована стандартами, например IEEE 754 (fpu большинства современного железа реализуют этот стандарт).
Например, как минимум одинаковые вычисления (в точности до последовательности всех операций), должны давать одинаковый бинарный результат (при одинаковых флагах fpu).

А>Умножение на минус единицу ничем в этом плане не отличается.


Единица в IEEE 754 binary64 представляется точно, знак это всего лишь отдельный бит — поэтому никаких проблем с проверкой быть не должно. (это в общем, в код ТС я пока не вникал)
Re[2]: vs2012 , ошибка оптимизатора?
От: ononim  
Дата: 14.04.14 20:33
Оценка:
C>Вывод программы:
C>
C>Error!!! : i=1 omega=-12 -J=-22
C>Error!!! : i=3 omega=-34 -J=-44
C>Error!!! : i=5 omega=-56 -J=-66
C>

а ну тогда да.. эпсилон не причем
Как много веселых ребят, и все делают велосипед...
Re[2]: vs2012 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 14.04.14 21:46
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>Проявляется при оптимизации -O2. (-O1 — ошибки нет, но у меня производительность критична.)

C>При убирании '-' в цикле в foo — ошибка пропадает.
C>При удалении добавлении любого дополнительного кода внутрь цикла в foo, тое пропадает.
C>Поэтому и грешу на оптимизатор.

Да, видимо так и есть. Немного сократил:
// Bug in VS2012 11.0.50727.1 x64 Release /O2
// Output is: i=1 Y=-1001 X=1005

#include <iostream>
#include <iterator>
#include <numeric>
using namespace std;

size_t index(size_t i, size_t size)
{
    return i*(size+1);
}

__declspec(noinline) // affects bug
void foo(size_t size, const double * const X, double * const Y)
{
    for(size_t i=0; i!=size; ++i) // replacing size_t with unsigned affects bug
        Y[i] = -X[index(i, size)]; // negation affects bug
}

int main()
{
    const size_t size=4;
    double X[size*size], Y[size];
    iota(begin(X), end(X), 1000.);
    foo(size, X, Y);
    const size_t i = 1;
    cout << "i=" << i << " Y=" << Y[i] << " X=" << X[index(i, size)] << endl;
}
Re[5]: vs2012 , ошибка оптимизатора?
От: Аноним  
Дата: 14.04.14 22:29
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, Аноним, Вы писали:


C>>>>>Подозреваю, что нашел ошибку компилятора.

А>>>>Сравнивать даблы по значению нельзя.
G>>>В данном случае можно.
А>>Нельзя никогда, если два дабла получены в результате вычислений.

EP>Это всего лишь rule of dumb, подходящий для 99% случаев.

Это то, о чем нужно думать, прежде, чем кричать о найденой ошибке в компиляторе.

EP>В общем случае их можно сравнивать. Особенно когда работа с такими числами регламентирована стандартами, например IEEE 754 (fpu большинства современного железа реализуют этот стандарт).

EP>Например, как минимум одинаковые вычисления (в точности до последовательности всех операций), должны давать одинаковый бинарный результат (при одинаковых флагах fpu).
А кто вообще гарантирует, что вычисления будут одинаковыми с точностью до инструкций? Что оптимизатор одинаково их заоптимизирует в друх разных местах, например?

EP>Единица в IEEE 754 binary64 представляется точно, знак это всего лишь отдельный бит — поэтому никаких проблем с проверкой быть не должно. (это в общем, в код ТС я пока не вникал)

никто никому ничего не должен. Что именно решит компилятор — его дело. Он может реализовать умножение так, как ему удобнее, а не так, как вы думаете.
Re[6]: vs2012 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 14.04.14 23:00
Оценка:
Здравствуйте, Аноним, Вы писали:

C>>>>>>Подозреваю, что нашел ошибку компилятора.

А>>>>>Сравнивать даблы по значению нельзя.
G>>>>В данном случае можно.
А>>>Нельзя никогда, если два дабла получены в результате вычислений.
EP>>Это всего лишь rule of dumb, подходящий для 99% случаев.
А>Это то, о чем нужно думать, прежде, чем кричать о найденой ошибке в компиляторе.

Так а кто кричит? Коллега даже знак вопроса в сабже поставил

EP>>В общем случае их можно сравнивать. Особенно когда работа с такими числами регламентирована стандартами, например IEEE 754 (fpu большинства современного железа реализуют этот стандарт).

EP>>Например, как минимум одинаковые вычисления (в точности до последовательности всех операций), должны давать одинаковый бинарный результат (при одинаковых флагах fpu).
А>А кто вообще гарантирует, что вычисления будут одинаковыми с точностью до инструкций? Что оптимизатор одинаково их заоптимизирует в друх разных местах, например?

С точностью до инструкции нет гарантий, а вот до получения тех же значений — вполне. Именно для этого и существуют такие настройки компиляторов как floating-point behavior, с /fp:precise по умолчанию. Например, fp сложение не ассоциативно — оптимизатор не может просто взять и "переставить скобки" в (a+b)+c — так как это влияет на результат.
Или, например, настройка fp rounding.
Другой пример — см. какие свойства есть в std::numeric_limits, то есть в ISO C++.

EP>>Единица в IEEE 754 binary64 представляется точно, знак это всего лишь отдельный бит — поэтому никаких проблем с проверкой быть не должно. (это в общем, в код ТС я пока не вникал)

А>никто никому ничего не должен. Что именно решит компилятор — его дело. Он может реализовать умножение так, как ему удобнее, а не так, как вы думаете.

Компилятор конечно может сделать что угодно, хоть чайник вскипятить.
Но я говорю про те компиляторы, которые лично проверял — GCC, MSVC и частично Clang, причём разных версий, на разных архитектурах. Регулярно гоняю достаточно длинные цепочки fp вычислений на unit-test'ах — результаты идентичны вплоть до бинарного представления.
Re[3]: vs2012 , ошибка оптимизатора?
От: Vain Россия google.ru
Дата: 15.04.14 01:24
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Да, видимо так и есть. Немного сократил:

Ты можешь завести баг на сайте мс и отправить им этот пример, интересно что ответят.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: vs2012 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 15.04.14 01:35
Оценка:
Здравствуйте, Vain, Вы писали:

EP>>Да, видимо так и есть. Немного сократил:

V>Ты можешь завести баг на сайте мс и отправить им этот пример, интересно что ответят.

Я-то могу (недавно заводил по поводу ICE), но тут есть два момента:
1. Мне кажется здесь уже проскакивал подобный баг (именно в VS2012), хорошо бы найти ту тему и сравнить.
2. Это VS2012(причём не обновлённый), а уже есть VS2013, которого у меня нет под рукой. Нужно в первую очередь проверить на VS2013.
Re: vs2012 , ошибка оптимизатора?
От: denisko http://sdeniskos.blogspot.com/
Дата: 15.04.14 09:41
Оценка:
Здравствуйте, Chorkov, Вы писали:
Ассемблер покажи.
Поскольку ошибка идет через два дабла, есть мнение, что для негоциации используется неправильная маска в xmm регистре, при этом скорее всего умный оптимизатор подгружает туда сразу два дабла, отсюда первый отрабатывает нормально, а второй портится маской.
<Подпись удалена модератором>
Re: vs2012 , ошибка оптимизатора?
От: FoolS.Top Армения  
Дата: 15.04.14 11:31
Оценка:
Здравствуйте, Chorkov,

Здесь тоже...
Feierlich, misterioso
Re[5]: vs2012 , ошибка оптимизатора?
От: denisko http://sdeniskos.blogspot.com/
Дата: 15.04.14 15:54
Оценка:
Здравствуйте, pentagra, Вы писали:

Коллеги, покажите же асм этого дела, интересно как он начудил.
<Подпись удалена модератором>
Re[6]: vs2012 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 15.04.14 16:26
Оценка:
Здравствуйте, denisko, Вы писали:

D>Коллеги, покажите же асм этого дела, интересно как он начудил.


VS2012 x64 O2
C:\vs2012_fp_bug>cl -O2 /FA main.cpp
; Function compile flags: /Ogtpy
;    COMDAT ?foo@@YAX_KQEBNQEAN@Z
_TEXT    SEGMENT
size$ = 16
X$ = 24
Y$ = 32
?foo@@YAX_KQEBNQEAN@Z PROC                ; foo, COMDAT
; File c:\vs2012_fp_bug\main.cpp
; Line 14
$LN18:
    sub    rsp, 8
; Line 15
    xor    r9d, r9d
    mov    r11, rdx
    mov    r10, rcx
    test    rcx, rcx
    je    $LN1@foo
    movapd    xmm1, XMMWORD PTR __xmm@80000000000000008000000000000000
    cmp    rcx, 4
    jb    $LN11@foo
; Line 16
    mov    QWORD PTR [rsp+16], rbx
    lea    rbx, QWORD PTR [rcx+1]
    lea    rdx, QWORD PTR [r8-8]
    lea    rdx, QWORD PTR [rdx+rcx*8]
    lea    rcx, QWORD PTR [rcx*2-1]
    lea    rbx, QWORD PTR [r11+rbx*8]
    lea    rcx, QWORD PTR [rcx+1]
    lea    rcx, QWORD PTR [r11+rcx*8]
    cmp    r8, rcx
    ja    SHORT $LN12@foo
    cmp    rdx, rbx
    jae    SHORT $LN16@foo
$LN12@foo:
    mov    rax, r10
    mov    QWORD PTR [rsp], rdi
    lea    rbx, QWORD PTR [r10+1]
    and    eax, 3
; Line 15
    lea    rdi, QWORD PTR [r10+1]
    mov    rdx, r10
    sub    rdx, rax
    shl    rbx, 5
    mov    rcx, r8
    mov    rax, r11
    add    rdi, rdi
    npad    4
$LL3@foo:
; Line 16
    movupd    xmm0, XMMWORD PTR [rax]
    add    r9, 4
    lea    rcx, QWORD PTR [rcx+32]
    xorpd    xmm0, xmm1
    movupd    XMMWORD PTR [rcx-32], xmm0
    movupd    xmm0, XMMWORD PTR [rax+rdi*8]
    add    rax, rbx
    xorpd    xmm0, xmm1
    movupd    XMMWORD PTR [rcx-16], xmm0
    cmp    r9, rdx
    jne    SHORT $LL3@foo
    mov    rdi, QWORD PTR [rsp]
$LN16@foo:
    mov    rbx, QWORD PTR [rsp+16]
$LN11@foo:
; Line 15
    cmp    r9, r10
    je    SHORT $LN1@foo
    lea    rax, QWORD PTR [r10+1]
    lea    rdx, QWORD PTR [r10*8+8]
    imul    rax, r9
    lea    rcx, QWORD PTR [r11+rax*8]
    npad    3
$LL10@foo:
; Line 16
    movsdx    xmm0, QWORD PTR [rcx]
    inc    r9
    add    rcx, rdx
    xorpd    xmm0, xmm1
    movsdx    QWORD PTR [r8+r9*8-8], xmm0
    cmp    r9, r10
    jne    SHORT $LL10@foo
$LN1@foo:
; Line 17
    add    rsp, 8
    ret    0
?foo@@YAX_KQEBNQEAN@Z ENDP                ; foo
Re[5]: vs2012 , ошибка оптимизатора?
От: MT-Wizard Украина  
Дата: 15.04.14 16:37
Оценка:
Здравствуйте, pentagra, Вы писали:

P>...


Это баг векторизатора. Соответственно, воркараунд — #pragma loop(no_vector) перед циклом в void foo()
Создал баг в бекенде.
А ти, москалику, вже приїхав (с)
Re[7]: vs2012 , ошибка оптимизатора?
От: denisko http://sdeniskos.blogspot.com/
Дата: 15.04.14 16:43
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, denisko, Вы писали:


D>>Коллеги, покажите же асм этого дела, интересно как он начудил.

Спасиб, конечно, но foo то мне зачем? Ошибка почти наверняка здесь

const double x = X[index(i, size)], y = -Y[i];
        if(x != y)
<Подпись удалена модератором>
Re[8]: vs2012 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 15.04.14 17:27
Оценка:
Здравствуйте, denisko, Вы писали:

D>>>Коллеги, покажите же асм этого дела, интересно как он начудил.

D>Спасиб, конечно, но foo то мне зачем? Ошибка почти наверняка здесь
D>
D>const double x = X[index(i, size)], y = -Y[i];
D>        if(x != y)
D>


Баг не в проверке, а в том что Y заполняется не теми значениями внутри foo.
Re[6]: vs2012 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 15.04.14 17:32
Оценка:
Здравствуйте, MT-Wizard, Вы писали:

MW>Создал баг в бекенде.


Ссылка?
Re[7]: vs2012 , ошибка оптимизатора?
От: MT-Wizard Украина  
Дата: 15.04.14 19:27
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Здравствуйте, MT-Wizard, Вы писали:


MW>>Создал баг в бекенде.


EP>Ссылка?


А разве внутренний ТФС выставлен наружу?
А ти, москалику, вже приїхав (с)
Re[8]: vs2012 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 15.04.14 19:30
Оценка:
Здравствуйте, MT-Wizard, Вы писали:

MW>>>Создал баг в бекенде.

EP>>Ссылка?
MW>А разве внутренний ТФС выставлен наружу?

Я думал ты создал на https://connect.microsoft.com/VisualStudio/feedback/
Re[7]: vs2012 , ошибка оптимизатора?
От: ArtDenis Россия  
Дата: 16.04.14 01:55
Оценка:
Здравствуйте, Аноним, Вы писали:

AD>>На VS2013 не проявляется.

А>Проявляется

Хм. Точно. А из студии если компилить, то не хочет.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[8]: vs2012 , ошибка оптимизатора?
От: ArtDenis Россия  
Дата: 16.04.14 02:05
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Здравствуйте, Аноним, Вы писали:


AD>>>На VS2013 не проявляется.

А>>Проявляется

AD>Хм. Точно. А из студии если компилить, то не хочет.


Похоже всё дело в опции /GL (global optimization). Если её включить, то баг не проявляется.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: vs2012 , ошибка оптимизатора?
От: antonio_banderas Россия  
Дата: 16.04.14 15:11
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>Здравствуйте,

C>Подозреваю, что нашел ошибку компилятора.
C>Проявляется в релизе на 2012-я студии (17.00.61030).

То майкрософт, он всегда глючным считался.
Вот я вчера g++ 4.8.1 завалил с ошибкой internal compiler error: Segmentation fault.

  Скрытый текст
struct CLEntry
{
    const char* const longName;
    const int paramType;
    const int isRequired;
};

constexpr CLEntry table[] =
{
    { "--file", 1,  0 },
};

#define countof(x) (sizeof(x) / sizeof((x)[0]))

static_assert(countof(table) <= 0 || table[0].paramType != 0 || table[0].isRequired != 1, "row 0: must be ...");  // this line crashes the compiler! g++ (Ubuntu 4.8.1-2ubuntu1~12.04) 4.8.1
Re[4]: vs2012 , ошибка оптимизатора?
От: Evgeny.Panasyuk Россия  
Дата: 16.04.14 15:37
Оценка:
Сделал bug report.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.