2012-05-26 1 views
11

Ich habe kürzlich von einer GTX480 auf eine GTX680 umgestellt, in der Hoffnung, dass sich die verdreifachte Anzahl von Kernen als signifikante Leistungssteigerung in meinem CUDA-Code manifestieren würde. Zu meinem Entsetzen habe ich festgestellt, dass meine speicherintensiven CUDA-Kernel auf der GTX680 30% -50% langsamer laufen.Wie quantifizieren Sie die Verarbeitungsabwägungen von CUDA-Geräten für C-Kerne?

Ich weiß, dass dies nicht unbedingt eine Programmierfrage ist, aber es hat direkten Einfluss auf die Leistung von CUDA Kernel auf verschiedenen Geräten. Kann jemand einen Einblick in die Spezifikationen von CUDA-Geräten geben und aufzeigen, wie sie ihre Leistung auf CUDA C-Kernen ableiten können?

+3

Für maximale Leistung müssen Sie Ihren Code für verschiedene GPU-Konfigurationen optimieren. –

+3

Aus dem, was Wikipedia mir sagt, ist das Speicher-BW des 680 nicht viel höher als das des 480. Wenn Sie also an das Gedächtnis gebunden sind, werden Sie nicht viel Beschleunigung sehen. Ich kann nicht erklären, warum Sie eine Verlangsamung sehen. –

+0

Diese Version von CUDA Toolkit verwenden Sie? – geek

Antwort

9

Nicht gerade eine Antwort auf Ihre Frage, aber einige Informationen, die zum Verständnis der Performance der GK104 (Kepler, GTX680) gegenüber dem GF110 (Fermi, GTX580) hilfreich sein könnten:

Am Fermi , die Kerne laufen auf der doppelten Frequenz des Rests der Logik. Auf Kepler laufen sie mit der gleichen Frequenz. Das halbiert effektiv die Anzahl der Kerne auf Kepler, wenn man mehr Äpfel mit Äpfeln vergleichen will als Fermi. Damit bleibt der GK104 (Kepler) mit 1536/2 = 768 "Fermi Equivalent Cores", was nur 50% mehr ist als die 512 Kerne auf dem GF110 (Fermi).

Betrachtet man die Anzahl der Transistoren, hat der GF110 3 Milliarden Transistoren, während der GK104 3,5 Milliarden hat. Obwohl der Kepler dreimal so viele Kerne hat, hat er nur etwas mehr Transistoren. Jetzt hat der Kepler nicht nur 50% mehr "Fermi-äquivalente Kerne" als Fermi, sondern jeder dieser Kerne muss viel einfacher sein als die von Fermi.

Also, diese beiden Probleme erklären wahrscheinlich, warum viele Projekte eine Verlangsamung bei der Portierung nach Kepler sehen.

Weiterhin wurde die GK104, eine Version von Kepler für Grafikkarten, so abgestimmt, dass die Zusammenarbeit zwischen Threads langsamer ist als auf Fermi (für Grafik ist diese Zusammenarbeit nicht so wichtig). Ein potenzieller potenzieller Leistungsgewinn kann nach Berücksichtigung der oben genannten Fakten dadurch negiert werden.

Es gibt auch das Problem der Gleitkommazahl mit doppelter Genauigkeit. Die Version von GF110, die in Tesla-Karten verwendet wird, kann Gleitkommawerte mit doppelter Genauigkeit mit der halben Genauigkeit einfacher Genauigkeit ausführen. Wenn der Chip in Grafikkarten verwendet wird, ist die Leistung mit doppelter Genauigkeit künstlich auf 1/8 der Leistung mit einfacher Genauigkeit begrenzt, aber dies ist immer noch viel besser als die Leistung der doppelten Genauigkeit von GK104 mit einer Genauigkeit von 1/24.

+0

Ausgezeichnete Informationen, danke. –

+2

Einige ganzzahlige Leistung, einschließlich Verschiebungen, Vergleiche und Multiplikationen, sind auch auf dem GK104 viel langsamer. Geben Sie auch Konvertierungen ein. Siehe Tabelle 5-1 (Seite 74) des CUDA C-Programmierhandbuchs Version 4.2. Rechenleistung 3.0 ist der GK104. Achten Sie auf das Verhältnis zu Gleitkommaoperationen mit einfacher Genauigkeit. Der GK110, der im vierten Quartal 2012 auf den Markt kommt, behebt viele davon und ist der "echte" Next-Gen-Tesla-Teil. – Peter

+0

@Peter: Danke für die Informationen. Es scheint mir, dass das alles wirklich zeigt, dass der GK104 nie als ein Computerteil gedacht war. Trotzdem kommt der Chip in eine Tesla-Karte, die K10. Es sei denn, die Grafikkartenversion wurde auf irgendeine Art und Weise verschoben, das macht für mich keinen Sinn. Es gibt zwar Beschleunigungen, aber nur Algorithmen, die den Algorithmen sehr ähnlich sind, wenn die Kerne als Shader (für Grafiken) verwendet werden. –

1

ich glaube, das Problem in der Anzahl der Streaming-Multiprozessoren liegen: Die GTX 480 15 SMs hat, die GTX 680 nur 8.

Die Zahl der SMs ist wichtig, da bei den meisten 8/16 Blöcke oder 1536/2048 Threads (Rechenfähigkeit 2.0/3.0) können sich auf einem einzelnen SM befinden. Die Ressourcen, die sie teilen, z.B. Shared Memory und Register können die Anzahl der Blöcke pro SM weiter begrenzen. Außerdem kann die höhere Anzahl von Kernen pro SM auf der GTX 680 nur vernünftig unter Verwendung von instruction-level parallelism ausgenutzt werden, d. H. Durch Pipelining mehrerer unabhängiger Operationen.

Um die Anzahl der Blöcke zu ermitteln, die Sie gleichzeitig pro SM ausführen können, können Sie die Tabelle CUDA Occupancy Calculator von nVidia verwenden. Um die von Ihrem Kernel benötigte Menge an gemeinsam genutztem Speicher und Registern anzuzeigen, fügen Sie beim Kompilieren -Xptxas –v zur Befehlszeile nvcc hinzu.

+0

Es ist fast sicher eine Speicherbandbreite Problem, ich einige Kernel neu strukturiert um den Speicheraufwand zu reduzieren und die Leistungsunterschiede auf wenige Prozent zu reduzieren. –

+0

@GearoidMurphy: Ok, aber Sie können immer noch versuchen, Ihre Blöcke und Code neu zu strukturieren, um die> 3x Anzahl der Kerne zu nutzen. – Pedro

2

Einer der Fortschritte der neuen Kepler-Architektur sind 1536 Kerne, die in acht 192-Kern-SMX's gruppiert sind, aber gleichzeitig ist diese Anzahl von Kernen ein großes Problem. Weil shared memory noch auf 48 kb beschränkt ist. Wenn Ihre Anwendung also eine Menge SMX-Ressourcen benötigt, können Sie 4 Warps nicht parallel auf einer einzelnen SMX ausführen. Sie können Ihren Code profilieren, um die tatsächliche Belegung Ihrer GPU zu finden. Die möglichen Wege zur Verbesserung Ihrer Anwendung:

  1. Verwenden Sie Warp-Vote-Funktionen anstelle von Shared Memory-Kommunikation;
  2. eine Anzahl von Profilblöcken erhöhen und eine Anzahl von Gewindegängen in einem Block verringern;
  3. optimieren Sie globale Ladungen/Geschäfte. Kepler hat 32 Lade-/Speichermodule für jede SMX (zweimal mehr als bei Kepler).
+0

@Pedro SMX ist eine Abkürzung. NVidia nennt SM-Design der nächsten Generation als SMX. siehe [NVidia Whitepaper] (http://www.geforce.com/Active/en_US/en_US/pdf/GeForce-GTX-680-Whitepaper-FINAL.pdf). Abstimmungsfunktionen können dabei helfen, einige Werte auszutauschen/freizugeben, ohne sie im Shared Memory zu speichern. Zum Beispiel können Sie die Reduzierung ohne Nutzung des gemeinsamen Speichers implementieren. – geek

+0

Diese Antwort ist ein wenig verwirrend. Kannst du es etwas aus Gründen der Klarheit erweitern? – Pedro

2

Ich installiere nvieuw und ich benutze coolbits 2.0, um Ihre Shader-Kerne von Standard auf maximale Leistung zu entsperren. Außerdem müssen Sie beide Anschlüsse Ihres Geräts auf 1 anzeigen lassen, was im nVidia Bedienfeld 1/2 und Bildschirm 2/2 aktiviert werden kann. Jetzt müssen Sie diesen Bildschirm mit dem anderen und dem Windows-Auflösungskonfigurations-Bildschirmmodus auf den erweiterten Desktop klonen.

Mit nVidia Inspector 1.9 (Treiber auf BIOS-Ebene) können Sie diesen Modus aktivieren, indem Sie ein Profil für die Anwendung einrichten (Sie müssen die EXE-Datei der Anwendung zum Profil hinzufügen). Jetzt haben Sie fast doppelte Leistung (achten Sie auf die Temperatur).

DX11 bietet auch Tesselation, also sollten Sie diese überschreiben und Ihre native Auflösung skalieren. Ihre native Auflösung erreichen Sie, indem Sie einen niedrigeren Wert wie 960-540P rendern und die 3D-Pipelines den Rest machen, um auf Full-HD zu skalieren (in nv Control Panel Desktop-Größe und -Position). Skalieren Sie nun die unteren res auf Vollbild mit Display, und Sie haben Full HD mit doppelt so viel Texturgröße im laufenden Betrieb und alles sollte zum Rendern von 3D-Texturen mit extremer LOD-Verzerrung (Detaillierungsgrad) gut sein. Ihr Bildschirm muss automatisch zoomen!

Auch können Sie sli Config Computer schlagen. Auf diese Weise erziele ich höhere Punktzahlen als 3-way sli in Tessmark. Hohe AA Einstellungen wie 32X Mixed Sample machen alles wie HD in AAA Qualität (in Tessmark und Heavon Benchies). Im Endscore gibt es keine Auflösung, daher ist es nicht wichtig, dass Sie Ihre native Auflösung rendern!

Dies sollte Ihnen einige echte Ergebnisse geben, so lesen Sie bitte nachdenklich nicht literarisch.

Verwandte Themen