Hello,
I have found a behaviour of MinGW-W64 5.3.0 that disturbs me very much: the
results of floating-point operations may differ, if they are run on different
threads. This does not happen with Visual Studio 2015 and not with g++ 4.9.2 on
my Debian Linux.
Please consider the following program:
-------------------------------------------------
#include <iostream>
#include <future>
#include <cmath>
#include <string>
#include <thread>
std::string getResult()
{
std::cout << "Thread id: " << std::this_thread::get_id() << std::endl;
std::string result = "Result:\n";
double a, b, c;
int i;
for (i = 0, a = 1.0; i < 10000000; i++)
{
a *= 1.00000001;
b = sqrt(a);
c = pow(a, 0.5);
if (b == c)
continue;
result += std::string("a: ") + std::to_string(a) + " b: "
+ std::to_string(b) + " c: " +
std::to_string(c) + "\n";
}
return result;
}
int main()
{
std::string string1 = getResult();
std::future<std::string> result = std::async(std::launch::async,
getResult);
std::string string2 = result.get();
if (string1 != string2)
{
std::cout << "String 1 is: " << std::endl << string1 <<
std::endl
<< " and string 2 is: " << std::endl << string2
<< std::endl;
}
else
{
std::cout << "The results are the same." << std::endl;
}
return 0;
}
-------------------------------------------------
If I compile it with g++ -O0 -std=gnu++11 Main.cpp the output is
-------------------------------------------------
Thread id: 1
Thread id: 2
The results are the same.
-------------------------------------------------
If I compile it with g++ -O1 -std=gnu++11 Main.cpp the output is
-------------------------------------------------
Thread id: 1
Thread id: 2
String 1 is: ...
-------------------------------------------------
The same happens with "-O2".
If I change the line
std::future<std::string> result = std::async(std::launch::async,
getResult);
to
std::future<std::string> result = std::async(getResult);
then the result is independent from the optimization flag the following:
-------------------------------------------------
Thread id: 1
Thread id: 1
The results are the same.
-------------------------------------------------
What actually disturbs me, is that the results differ with asynchronous
execution and optimization turned on. I tried parameters like -ffloat-store
-msse2 -mfpmath=sse to have consistent floating-point operation results, but
this won't help.
Is this a bug? Or are there compiler flags that force the floating-point
operation results to be consistent?
Any help is greatly appreciated!
Regards,
Benjamin
------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public