2013-07-10 24 views
6

Mam jądro OpenCL, które musi przetwarzać tablicę jako wiele tablic, gdzie każda suma podparów jest zapisywana w lokalnej tablicy pamięci podręcznej.Tworzenie lokalnej tablicy dynamicznej wewnątrz jądra OpenCL

na przykład wyobrazić sobie szereg Fowling:

[[1, 2, 3, 4], [10, 30, 1, 23]] 
  • Każda praca grupę pobiera tablicę (w przedstawionym poniżej mamy 2 z pracą grupy);
  • Każdy element roboczy przetwarza dwa indeksy tablicowe (na przykład mnożą indeks wartości local_id), gdzie wynik elementu roboczego jest zapisywany w tablicy współużytkowanej grupy roboczej.

    __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]; 
        } 
    } 
    

Problem polega na tym, że nie mogę określić rozmiar tablicy pamięci podręcznej za pomocą parametru jądra, ale muszę w celu uzyskania dynamicznego jądra.

Jak mogę go utworzyć dynamicznie? jak funkcja malloc w c ...

Czy jedynym dostępnym rozwiązaniem jest wysłanie tablicy temp do mojej funkcji jądra?

+0

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

Odpowiedz

15

ten można osiągnąć przez dodanie __local tablicy jako parametr jądra:

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

i zapewnienie żądanego rozmiaru parametru jądra:

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

pamięci lokalnej będą przydzielone po wywołaniu jądra . Należy pamiętać, że dodatkowe kontrole mogą być konieczne w celu zapewnienia, że ​​wymagany rozmiar lokalnej pamięci nie przekracza limitu urządzenia.