2013-07-10 11 views
6

Ich habe einen OpenCL-Kernel, der ein Array als mehrere Arrays verarbeiten muss, wobei jede Sub-Array-Summe in einem lokalen Cache-Array gespeichert wird.Erstellen eines lokalen Arrays dynamisch innerhalb des OpenCL-Kerns

zum Beispiel vorstellen, dass die fowling Array:

[[1, 2, 3, 4], [10, 30, 1, 23]] 
  • Jede Arbeitsgruppe erhält einen Array (im exemple haben wir 2 Arbeitsgruppen);
  • Jedes Work-Item verarbeitet zwei Array-Indizes (zum Beispiel multipliziert den Value-Index die lokale_ID), wobei das Work-Item-Ergebnis in einem freigegebenen Workgroup-Array gespeichert wird.

    __kernel void test(__global int **values, __global int *result, const int array_size){ 
        __local int cache[array_size]; 
    
        // initialise 
        if (get_local_id(0) == 0){ 
         for (int i = 0; i < array_size; i++) 
          cache[i] = 0; 
        } 
    
        barrier (CLK_LOCAL_MEM_FENCE); 
    
        if(get_global_id(0) < 4){ 
         for (int i = 0; i<2; i++) 
          cache[get_local_id(0)] += values[get_group_id(0)][i] * 
                     get_local_id(0); 
        } 
    
        barrier (CLK_LOCAL_MEM_FENCE); 
    
        if(get_local_id(0) == 0){ 
         for (int i = 0; i<array_size; i++) 
          result[get_group_id(0)] += cache[i]; 
        } 
    } 
    

Das Problem ist, daß ich die Cache nicht Feldgrße durch Verwendung eines Kernel-Parameter definieren kann, aber ich muß, um einen dynamischen Kernel zu haben.

Wie kann ich es dynamisch erstellen? wie malloc funktion in c ...

Oder die einzige lösung ist ein temp-array an meine kernel funktion zu senden?

__kernel void test(__global int **values, __global int *result, 
    const int array_size, __local int * cache) 

und Bereitstellen gewünschte Größe der Kernel-Parameter:

+0

http://stackoverflow.com/questions/2541929/how-doi-i-use-local-memory-in-opencl –

Antwort

15

Dies kann durch Hinzufügen __local Array als Kernel-Parameter erreicht werden

clSetKernelArg(kernel, 3, array_size*sizeof(int), NULL); 

Der lokale Speicher wird von dem Kernel-Aufruf zugeordnet wird . Beachten Sie, dass zusätzliche Überprüfungen erforderlich sein können, um sicherzustellen, dass die erforderliche lokale Speichergröße das Gerätelimit nicht überschreitet.

Verwandte Themen