Die Reihenfolge der Konsolenausgaben verlangsamt das Multi-Thread-Programm

8

Beim Kompilieren des folgenden Codes

%Vor%

Unter MinGW 4.8.1 dauert es ungefähr 2,5 Sekunden, um auf meiner Box ausgeführt zu werden. Das ist ungefähr die Zeit, die es dauert, die Funktion task nur single-threadly auszuführen.

Wenn ich jedoch die Zeile in der Mitte auskommentiere und daher die Zeile vorher auskommentiere (das heißt, wenn ich die Reihenfolge tausche, in der d und "(Help)" in std::cout geschrieben sind), dauert das Ganze jetzt 8-9 Sekunden.

Was ist die Erklärung?

Ich habe es erneut getestet und herausgefunden, dass ich nur das Problem mit MinGW-build x32-4.8.1-win32-dwarf-rev3 habe, aber nicht mit MinGW build x64-4.8.1-posix-seh-rev3 . Ich habe eine 64-Bit-Maschine. Mit dem 64-Bit-Compiler dauern beide Versionen drei Sekunden. Bei Verwendung des 32-Bit-Compilers bleibt das Problem bestehen (und liegt nicht an der Versionsverwechslung).

    
Tobias Brüll 04.08.2013, 16:48
quelle

1 Antwort

1

Es hat nichts mit Multithreading zu tun. Es ist ein Problem der Schleifenoptimierung. Ich habe den ursprünglichen Code neu angeordnet, um etwas Minimalistisches zu bekommen, das das Problem demonstriert:

%Vor%

Wenn kompiliert und ausgeführt und mit:

%Vor%

Die Ausgabe ist:

%Vor%

Der größte Teil des Zeitunterschieds wird durch den für die innere Schleife generierten Assemblercode erklärt: Der schnelle Fall wird direkt in xmm0 akkumuliert, während der langsame Fall in xmm1 akkumuliert wird - was zu 2 extra movsd Anweisungen führt.

Wenn Sie jetzt mit der Option '-ftree-loop-linear' kompiliert werden:

%Vor%

Die Ausgabe wird:

%Vor%     
Come Raczy 13.08.2013, 07:36
quelle

Tags und Links