2016-05-03 9 views
1

Ich habe im Grunde die gleiche Frage gestellt in this discussion. Insbesondere möchte ich auf diese endgültige Antwort verweisen:Die Motivation für mehrdimensionale CUDA Block Grid

Ich denke, es gibt zwei zusammen in diesem Faden vermischt verschiedene Fragen:

  1. Gibt es einen Performance-Vorteil eine 2D- oder 3D-Mapping zu verwenden von Eingabe- oder Ausgabedaten zu Threads? Die Antwort ist "absolut" für alle Gründe, die Sie und andere beschrieben haben. Wenn die Daten oder Berechnung räumliche Lokalität hat, so sollte die Zuordnung von Arbeit zu Threads in ein Warp sein.

  2. Gibt es einen Leistungsvorteil bei der Verwendung der mehrdimensionalen Gitter von CUDA für diese Arbeitsaufgabe? In diesem Fall glaube ich nicht, seit können Sie die Indexberechnung trivial selbst an der Spitze des Kernels tun. Dies brennt einige arithmetische Anweisungen, aber das sollte vernachlässigbar sein, verglichen mit dem Kernel-Start-Overhead.

Aus diesem Grund denke ich, die mehrdimensionale Gitter als Bequemlichkeit Programmierer gedacht sind eher als eine Art und Weise zu verbessern. Sie müssen unbedingt über Speicherzugriffsmuster jeder Warp denken, obwohl.

Ich möchte wissen, ob diese Situation noch heute gilt. Ich möchte den Grund wissen, warum ein mehrdimensionales "äußeres" Gitter benötigt wird.

Was ich versuche zu verstehen, ist, ob es einen signifikanten Zweck gibt (zB ein tatsächlicher Nutzen von räumlicher Lokalität) oder ist es aus Bequemlichkeit (zB in einem Bildverarbeitungskontext, ist es dort nur so dass CUDA sich des x/y "Patches" bewusst ist, den ein bestimmter Block verarbeitet, damit er ihn an den CUDA Visual Profiler oder etwas melden kann?

Eine dritte Option ist, dass dies nicht mehr als ein Überbleibsel aus früheren Versionen von CUDA war, wo es eine Umgehung für Hardware-Indizierung Grenzen war.

Antwort

6

Es gibt definitiv einen Vorteil in der Verwendung von multidimensionalen Gitter. Die verschiedenen Einträge (tid, ctaid) sind schreibgeschützte Variablen, die als spezielle Register sichtbar sind. Siehe PTX ISA

PTX eine Anzahl vordefinierter enthält, Nur-Lese-Variablen, die als Spezialregister sichtbar sind und mov oder cvt durch Befehle zugegriffen. Die Sonderregister sind:

%tid 
%ntid 
%laneid 
%warpid 
%nwarpid 
%ctaid 
%nctaid 

Wenn einige dieser Daten können ohne weitere Verarbeitung verwendet werden, nicht nur für Sie arithmetische Befehle gewinnen kann - möglicherweise bei jedem Schaltschritt von Multi-Dimension-Daten, aber noch wichtiger Sie speichern Register, was auf jeder Hardware eine sehr knappe Ressource ist.