Frage

Hallo Ich wollte nur wissen, ob es möglich ist, die folgende innerhalb des CUDA Kernel

zu tun
__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[1000];
  ...
}

oder die folgenden

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[size];
  ...
}
War es hilfreich?

Lösung

Sie können das erste Beispiel tun, ich habe die zweite nicht versucht.

Wenn Sie jedoch kann es helfen, möchten Sie vielleicht Ihr Programm neu zu gestalten, dies nicht zu tun. Sie wollen nicht 4000 Byte Speicher in Ihrem Kernel zuzuordnen. Das wird zu viel Einsatz von CUDA lokalen Speicher führen, da Sie nicht in der Lage sein, alles in die Register zu passen. CUDA lokale Speicher sind langsam (400 Zyklen der Speicherlatenzzeit).

Andere Tipps

Sie können 1 # tun, aber Vorsicht wird dies in jedem Thread durchgeführt werden!

Ihr zweites Snippet wird nicht funktionieren, weil die dynamische Speicherzuordnung bei Kernel-Laufzeit wird nicht unterstützt.

Sie können gemeinsam genutzten Speicher zuweisen dynamisch, wenn Sie den Kernel starten.

__global__ void compute(long *c1, long size, ...)
 {
  ...
   extern __shared__ float shared[];
  ...
 }

compute <<< dimGrid, dimBlock, sharedMemSize >>>( blah blah );

CUDA Programmieranleitung:

  

die Größe des Arrays zum Startzeitpunkt bestimmt wird (siehe Abschnitt 4.2.3).

dynamische Speicherzuweisung bei Kernel-Laufzeit unterstützt wird, überprüfen Sie das sdk Beispiel neue löschen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top