Ich versuche, CUDA-Code in OpenCL zu übersetzen und jetzt bin ich mit diesen Funktionen/Variablen fest:Was ist das OpenCL-Analog für __syncthreads() und blockIdx.x von CUDA?
__syncthreads()
blockIdx.x
Ich versuche, CUDA-Code in OpenCL zu übersetzen und jetzt bin ich mit diesen Funktionen/Variablen fest:Was ist das OpenCL-Analog für __syncthreads() und blockIdx.x von CUDA?
__syncthreads()
blockIdx.x
Eigentlich fand ich es durch meine eigene! Hier ist ein nützlicher Artikel: http://www.netlib.org/utk/people/JackDongarra/PAPERS/parcocudaopencl.pdf
Die Antwort ist: für die __syncthreads() verwenden Barriere (CLK_LOCAL_MEM_FENCE); Für blockIdx.x benutze get_group_id (0)!
__syncthreads()
->barrier(_)
aber stellen Sie sicher, dass Sie den Unterschied zwischen barrier(CLK_LOCAL_MEM_FENCE)
und barrier(CLK_GLOBAL_MEM_FENCE)
Kontrolle dieses question oder dieses documentation für weitere Informationen zu verstehen.
blockIdx.x
->get_group_id(0)
mit dem Sie die erste/x-Dimension-ID der Gruppe/Block
Es gibt viele Seiten im Netz geben, die Sie für die Portierung von CUDA OpenCL (zB here) helfen kann. Ich möchte nur erwähnen, wie es here für die "Barriere" darauf hinweisen, dass es barrier(CLK_LOCAL_MEM_FENCE)
und barrier(CLK_GLOBAL_MEM_FENCE)
: hauptsächlich der Unterschied ist, dass die erste eine korrekte Reihenfolge der Speichervorgänge sicherstellen, wenn Sie den lokalen Speicher (gemeinsam in CUDA) verwenden und die zweite, wenn Sie mit dem globalen Speicher arbeiten. Achten Sie darauf, die richtige für Ihren Fall zu verwenden.