2013-09-17 3 views
0

Итак, я знаю, как это сделать в CUDA, но в основном, я хочу передать небольшое число (0-5, переменная) _global ptrs в функцию, затем загрузить эти указатели в локальном или частном (из-за небольшого числа и того факта, что у меня уже есть локальная память в ядре, я не уверен, что быстрее, я собираюсь определить это экспериментально после того, как я получу его работу). Поэтому я написал ядро ​​как так:Передача массива в ядре в opencl

__kernel foo(
    __global int* img, 
    __global int** img_history, 
    __private int** private_history, 
    uint history_length)//could be local 
{ 
    for (int i = 0; i < history_length; i++) 
     private_history[i] = img_history[i]; 
} 

Чтобы пояснить, в CUDA я это сделать, как этот

__global__ foo(int* img, int** img_history, uint history_length) 
{ 
    int* private_history[10];//max values 10 
    for (int i = 0; i < history_length; i++) 
     private_history[i] = img_history[i]; 
} 

и загрузить его

int** host_array = new int*[history_length]; 
for (int i = 0; i < history_length; i++) 
    cudaMalloc(host_array+i,size); 
int** device_array; 
cudaMalloc(&device_array,sizeof(int*)*history_length); 
cudaMemcpy(device_array, host_array,sizeof(int*)*history_length,cudaMemcpyHostToDevice) 

Однако я получаю ошибку error: invalid address space for pointee of pointer argument to __kernel function , Каков правильный способ сделать это?

ответ

0

Я не знаю, как вы работаете в CUDA. Но это полностью запрещено в качестве аргумента для ядра OpenCL.

Вы не можете скопировать на устройство значение указателя, а затем использовать его напрямую, потому что адреса памяти отличаются.

Для того, чтобы сделать это вам нужно:

  1. Копирование только индексы img_history (не указатель) ссылающихся таблицу изображения.
  2. Работайте с индексами твой, как вам нравится (целочисленная операция).
  3. Используйте эти индексы для доступа к таблице изображений или выполняйте все, что хотите. Если вам нужно ограничить img этими индексами, то он должен быть параметром ядра. И вы должны скопировать все это. (Полная длина IMG массив)

Пример:

__kernel foo(
    __global int* img, 
    __global int* img_history, 
    __private int* private_history, 
    uint history_length)//could be local 
{ 
    for (int i = 0; i < history_length; i++) 
     private_history[i] = img_history[i]; 

    /* img[private_history[i]] */ //Use it as you wish 
} 
+0

Да, похоже, единственный способ сделать это в OpenCL для хранения img_history в непрерывной памяти, а это означает OpenCL просто не может обработать переменную длину список несмежных буферов. – IdeaHat

Смежные вопросы