2016-07-21 12 views
1

Beim Lesen über Code hatte ich ein paar Fragen, die mir in den Sinn kamen.OpenCL - For Loops und Beziehung mit GlobalWorkSize

Nehmen wir an, wir hatten eine globale Arbeitsgröße von einer Million Elemente in einem Array.

Nehmen Sie an, der Zweck des Kernels bestand darin, einfach 100 Elemente gleichzeitig zu addieren und diese Werte in einer Ausgabe zu speichern. Ex) Zum ersten Mal würde der Kernel die Elemente 0-99 summieren, dann würde es 1-100, dann 2-101 und so weiter machen. Alle summierten Werte werden in einem Array gespeichert.

Jetzt wissen wir, dass es 1 Million Elemente gibt, wenn wir dies an clEnqueueNDRangeKernel weitergeben, bedeutet das, dass der Kernel fast eine Million Mal ausgeführt wird?

Ich bemerkte, dass die for-Schleife im Kernel nur zu einhundert Elementen Schleifen, dann wird der Wert nur in einem anderen Array gespeichert. Wenn man also nur die for-Schleife betrachtet, würde man denken, dass sie nach 100 Elementen aufhören würde. Woher weiß der Computer, wann wir 1 Million Elemente erreicht haben? Liegt es daran, dass wir den Parameter in clEnqueueNDRangeKernel übergeben haben und auf atomarer Ebene wissen, dass mehr Elemente verarbeitet werden müssen?

Antwort

0

Das Gerät kann nicht wissen, dass es eine Million Elemente im Array gibt. Wenn Sie also global_work_size auf eine Million setzen, werden die letzten 99 Kernel das Array glücklicherweise überindizieren, was je nach Gerät zu Fehlern führen kann.

Wenn Sie den API-Aufruf clEnqueueNDRangeKernel mit einer Arbeitsgröße von N aufrufen, werden die Informationen an das Gerät gesendet und das Gerät führt so viele Arbeitsgruppen mit einheitlicher Größe aus, bis der Kernel N-mal ausgeführt wurde.

Hoffe das beantwortet Ihre Frage.

+0

Ja, es tut danke. Ich wurde gestern in einem Moment gefangen, wo ich nicht verstanden habe, wie der Kernel möglicherweise alle Elemente beenden könnte. Diese Antwort macht es klarer. –