Ich möchte den Code unter parallelisieren:
%Vor%Ich habe es so gemacht:
%Vor%Problem ist, dass es auf Intel-CPUs nur 50% schneller läuft, während es bei AMD 300% schneller ist. Ich betreibe es auf drei Intel-CPUs (Nehalem 2core + HT, Sandy Bridge 2core + HT, Ivy Brigde 4core + HT). AMD-Prozessor ist Phenom II x2 mit 4 Kernen entsperrt. Auf 2-Core-Intel-Prozessor läuft es mit 4 Threads 50% schneller. Auf 4-Core läuft es auch bei 4 Threads 50% schneller. Ich teste mit VS2012, Windows 7.
Wenn ich es mit 8 Threads versuche, ist es 8x langsamer als die serielle Schleife bei Intel. Ich nehme an, dass es durch HT verursacht wird.
Was denkst du darüber? Was ist der Grund für ein solches Verhalten? Vielleicht ist der Code nicht korrekt?
Ich würde falsches Teilen vermuten. Dies geschieht, wenn zwei Variablen die gleiche Cache-Zeile teilen. Effektiv müssen alle Operationen auf ihnen sehr teuer synchronisiert werden, auch wenn sie nicht gleichzeitig aufgerufen werden, da der Cache nur in Bezug auf Cache-Zeilen einer bestimmten Größe arbeiten kann, selbst wenn Ihre Operationen feiner sind -gekörnt. Ich würde vermuten, dass die AMD-Hardware einfach robuster ist oder ein anderes Hardware-Design hat, um damit fertig zu werden.
Um zu testen, ändern Sie den Code so, dass jeder Kern nur auf Blöcken arbeitet, die Vielfache von 64 Bytes sind. Dies sollte eine Cache-Zeilenfreigabe vermeiden, da die Intel-CPUs nur eine Cache-Zeile von 64 Bytes haben.
Ich würde sagen, dass Sie Ihre Compiler-Einstellungen ändern müssen, damit der kompilierte Code die Anzahl der Zweige minimiert. Die zwei verschiedenen CPU-Stile haben unterschiedliche Operations-Look-Ahead-Setups. Sie müssen die Einstellungen für die Compileroptimierung so ändern, dass sie der Ziel CPU entsprechen, nicht der CPU, auf der der Code kompiliert wird.
Sie sollten auch einen besseren Überblick über den CPU-Cache haben. Hier ist ein guter Artikel zu diesem Thema.
Die kurze Version: Der hw speichert die Daten zwischen, aber wenn Sie an demselben Speicher (SomeArray) arbeiten, muss er die ganze Zeit zwischen den Caches der CPUs synchronisieren, es kann sogar dazu führen, dass er langsamer läuft als in einem einzelnen mit einem Gewinde versehen.
Tags und Links c++ multithreading c++11 concurrency