2016-07-07 11 views
1

Ich entwickle einen CFD-Code (Computational Fluid Dynamics) mit CUDA. Während ich einige Beschleunigungstests an einer einzelnen Tesla K40 GPU (im Vergleich zur Intel Xeon E5 v2 CPU) für verschiedene Problemgrößen durchführe, zeigt die GPU eine höhere Beschleunigung, indem die Problemgröße erhöht wird. Zum Beispiel bekomme ich eine Beschleunigung um einen Faktor von ~ 1,5x für ~ 1 Million Elemente, während es sich auf ~ 11x für 10 Millionen Elemente verbessert.GPU-Leistung hängt von der Anzahl der Elemente ab (problem_size)

Ich habe keine Ahnung, dass das theoretisch die höhere Leistung für größere Probleme verursacht? Tatsächlich ist dies auch der Fall, den ich in vielen wissenschaftlichen Anwendungen (insbesondere Strömungsmechanik) gesehen habe, die auf GPU laufen. (Ich habe mich gefragt, ob etwas wie Kernel Overhead, Latenz usw. betroffen sind?)

Danke für jede Antwort oder Kommentar!

PS: Mit speedup meine ich das Verhältnis der Ausführungszeit des GPU-Codes zur Ausführungszeit der CPU-Version. Tatsächlich vergrößere ich die Problemgröße in beiden Versionen (und verwende natürlich die gleiche Problemgröße für beide in jedem Vergleichstest) und berechne die Beschleunigung für die entsprechende Problemgröße neu.

+1

Beschleunigung relativ zu was? – Drop

+0

Wie ich schon erwähnt habe; die Beschleunigung im Vergleich zur CPU. – Siamak

+3

Sie sollten weitere Details angeben. Wie ist die Geschwindigkeit pro Element? Erhalten Sie die relative Leistungssteigerung, weil die GPU pro Element schneller wird (wahrscheinlich aufgrund von versteckten Latenzen) oder weil die CPU langsamer wird (möglicherweise Cache-Größe). – havogt

Antwort

1

Der Grund läuft einen GPU-Kernel kommt in der Regel mit einem Overhead von konstanter Zeit (nicht konstant sein, aber wir können den Konstante Fall betrachten), wie Kernel-Overhead starten, PCIe Datentransfer usw.

Angenommen Dieser konstante GPU Overhead kostet t Sekunde, GPU-Geschwindigkeit ist g Millionen Elemente pro Sekunde, CPU-Geschwindigkeit ist c Millionen Elemente pro Sekunde. Beide Geschwindigkeiten sind konstant (möglicherweise nicht zutreffend, wie von @havogt angezeigt). Es gibt keinen Overhead für die CPU. Sie haben die Gleichungen

(t + 1/g) * 1.5 = 1/c 
(t + 10/g) * 11 = 10/c 

Sie dann

g/c = 37.125 
t = 0.640/c 

die

  1. für groß genug, um Datenelement (> 100 m) bedeutet, erhalten könnte, ist GPU Geschwindigkeit 37.125x der CPU-Geschwindigkeit schließen ;
  2. die Konstante Overhead Zeit entspricht der Zeit der Verarbeitung von 0.640M Elemente auf der CPU.
+0

Scheint vernünftig. Vielen Dank! – Siamak