передача неровного массива в ядро ​​в opencl

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

__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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]