2015-07-16 20 views
9

Ich habe gelesen, dass CUDA aus dem globalen Speicher 128 Bytes gleichzeitig lesen kann, so macht es Sinn, dass jeder Thread in einem Warp 4 Bytes in einem zusammengewachsenen Muster für insgesamt 128 Bytes lesen/schreiben kann.Warum sind CUDA-Vektortypen (int4, float4) schneller?

Lesen/Schreiben mit den Vektor-Typen wie int4 und float4 ist faster.

Aber was ich nicht verstehe, warum das ist. Wenn jeder Thread im Warp 16 Bytes anfordert und sich nur 128 Bytes gleichzeitig über den Bus bewegen können, woher kommt der Leistungsgewinn?

Ist es, weil es weniger Speicheranforderungen gibt, d. H. Es heißt "schnappen Sie 16 Bytes für jeden Thread in diesem Warp" einmal, im Gegensatz zu "4 Bytes für jeden Thread in diesem Warp" 4 mal? Ich kann nichts in der Literatur finden, das den genauen Grund angibt, warum die Vektortypen schneller sind.

Antwort

5

Ihr letzter Absatz ist im Grunde die Antwort auf Ihre Frage. Die Leistungsverbesserung kommt aus Effizienzgewinnen, auf zwei Arten

  1. auf der Befehlsebene, ein Mehrwort-Vektor-Lade- oder Speicher erfordert nur einen einzigen Befehl ausgegeben werden, so dass der Bytes pro Verhältnisbefehl höher ist und der Gesamtbefehl Latenz für eine bestimmte Speichertransaktion ist niedriger.
  2. Auf der Speicher-Controller-Ebene führt eine vektorbasierte Transaktionsanforderung von einem Warp zu einem größeren Nettodatenspeicherdurchsatz pro Transaktion, sodass das Byte pro Transaktionsverhältnis höher ist. Weniger Transaktionsanforderungen verringern die Konkurrenz von Speichercontrollern und können zu einer höheren Gesamtbandbreitenauslastung führen.

So erhalten Sie Effizienzgewinne sowohl im Multi-Prozessor und Speicher-Controller durch Vektorspeicherbefehle verwenden, im Vergleich zu dem einzelnen Anweisungen heraus, die einzelnen Speichertransaktionen erzeugen

die gleiche Menge an Bytes aus dem globalen Speicher erhalten
3

Sie haben gründliche Antwort auf die Frage in Parallel4All Blog: http://devblogs.nvidia.com/parallelforall/cuda-pro-tip-increase-performance-with-vectorized-memory-access/

Der Hauptgrund ist weniger Index Arithmetik pro Byte geladen, wenn Vektorlasten verwendet werden.

Es gibt eine weitere - mehr Lasten im Flug, die hilft, die Speicherbandbreite bei geringer Belegung zu sättigen.

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. – Luke

+0

Danke, habe es einfach gemacht. –

Verwandte Themen