Sie brauchen weniger Umleitung, um weniger Speicheroperationen zu haben?
Diese für eine gpu besser sollte:
typedef struct X
{
Y y[MAXSIZE];
int i;
} X;
statt
typedef struct X
{
int i;
Y y[MAXSIZE];
} X;
, weil es weniger Speicheroperationen pro Artikel lesen müssen konnte, weil zuerst in ursprünglichen Struktur Leseoperation während letztere weniger Effizienz hat struct kann es bei voller Effizienz durchführen.
Wenn das funktioniert, dies:
typedef struct Y
{
float z[MAXSIZE];
float n;
} Y;
sollte schneller sein zu besonders wenn MAXSIZE eine gerade Zahl ist.
Trennung von Y von i als zwei verschiedene Arrays anstelle von Array von Objekt von Y + i, wird für GPU schneller sein. Das gleiche gilt für z und n in Y. Reine Arrays von nativen Elementen sind schneller, insbesondere nur dann, wenn eines der Felder benötigt wird und andere nicht benötigt werden.
Das Hinzufügen von Dummy-Floats/Ints am Ende jeder Struktur könnte ebenfalls die Leistung ändern.
Die beste Leistung erfordert Thread-Level-Parallelität und zusammenhängende Lesevorgänge aus dem Speicher, während der objektorientierte Ansatz Lesbarkeit, Nachhaltigkeit und Aufrüstbarkeit bietet, aber keine Portabilität, da einige Hardware Probleme mit der Ausrichtung haben. Warum laden Sie den ganzen Float z [MAXSIZE] aus dem Speicher, während Sie nur z [i] benötigen? Weil es in einem Objekt ist.Wenn es ein reines Array wäre, würde es nur 1 Indexierungsoperation benötigen, um z [i] zu erhalten. Das Laden eines Objektfeldes erfordert einen Sprung des MAXSIZE-Schritts im Speicher, selbst wenn es nur einen einzelnen Gleitkommawert lädt, aber eine reine Array-Version Ihrer Wahl würde es mit einer Größe von 1 schreiten lassen und vielleicht optimale Geschwindigkeit erreichen.
Beispiel Array für z:
z[0]: 1st thread's z[0]
z[1]: 2nd thread's z[0]
z[2]: 3rd thread's z[0]
....
z[n]: 1st thread's z[1]
z[n+1]: 2nd thread's z[1]
z[n+3]: 3rd thread's z[1]
....
so bei jedem Schritt des
for(int i = 0; i < 100; i++)
GPU Zugriffe auf den Speicher in einem nicht-durchlöcherten Weise für alle z, die viel schneller als objektorientierten Version wäre meiner bescheidenen Meinung nach.
Ich habe eine Frage dazu in einem anderen Thread geschrieben, weil ich fühlte, wie die Natur der Frage war ganz anders, werfen Sie einen Blick, wenn Sie möchten: http://stackoverflow.com/questions/37981455/using -async-work-group-copy-with-a-custom-data-type Ich glaube, die Lösung für dieses Problem wird alle Daten von __global zu __local übergeben, verwenden Sie die __local Daten in den Schleifen, dann übergeben Sie es zurück __global. Ich habe diesen Code jedoch noch nicht fertiggestellt und werde noch keine voreiligen Schlüsse ziehen. Wenn es funktioniert, werde ich die Lösung hier veröffentlichen. – jiuwo