Erstellen Sie eine lokale Array-Dynamik im OpenCL-Kernel

Ich habe einen OpenCL-Kernel, der ein Array als mehrere Arrays verarbeiten muss, wobei jede Unterarraysumme in einem lokalen Cache-Array gespeichert wird.

Stellen Sie sich zum Beispiel das Vogel-Array vor:

[[1, 2, 3, 4], [10, 30, 1, 23]]
Jede Arbeitsgruppe bekommt ein Array (im Beispiel haben wir 2 Arbeitsgruppen);

Jedes Arbeitselement verarbeitet zwei Array-Indizes (multiplizieren Sie beispielsweise den Wertindex local_id), wobei das Ergebnis des Arbeitselements in einem gemeinsam genutzten Array der Arbeitsgruppe 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, dass ich die Cache-Array-Größe nicht mithilfe eines Kernel-Parameters definieren kann, aber ich muss, um einen dynamischen Kernel zu haben.

Wie kann ich es dynamisch erstellen? wie Malloc-Funktion in c ...

Oder ist die einzige verfügbare Lösung, ein temporäres Array an meine Kernelfunktion zu senden?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage