2013-07-10 38 views
6

Tôi có hạt nhân OpenCL cần xử lý mảng dưới dạng nhiều mảng trong đó mỗi tổng mảng phụ được lưu trong một mảng bộ nhớ cache cục bộ.Tạo mảng nội bộ động bên trong hạt nhân OpenCL

Ví dụ, hãy tưởng tượng mảng fowling:

[[1, 2, 3, 4], [10, 30, 1, 23]] 
  • Mỗi tác phẩm nhóm nhận một mảng (trong dụ chúng tôi có 2 công việc nhóm);
  • Mỗi mục công việc xử lý hai chỉ mục mảng (ví dụ nhân chỉ số giá trị local_id), trong đó kết quả mục công việc được lưu trong mảng chia sẻ nhóm công việc.

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

Vấn đề là tôi không thể xác định kích thước mảng bộ nhớ cache bằng cách sử dụng một tham số hạt nhân, nhưng tôi cần phải để có một hạt nhân năng động.

Làm cách nào để tạo tự động? như hàm malloc trong c ...

Hoặc giải pháp duy nhất có sẵn là gửi mảng tạm thời tới hàm hạt nhân của tôi?

+0

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

Trả lời

15

này có thể đạt được bằng cách thêm __local mảng như một tham số kernel:

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

và cung cấp kích thước mong muốn của tham số kernel:

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

Bộ nhớ cục bộ sẽ được phân bổ theo gọi hạt nhân . Lưu ý rằng việc kiểm tra thêm có thể cần thiết để đảm bảo kích thước bộ nhớ cục bộ được yêu cầu không vượt quá giới hạn thiết bị.

Các vấn đề liên quan