Так что я знаю, как сделать это в 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
, Как правильно это сделать?
Я не знаю, как вы делаете в CUDA. Но это совершенно запрещено в качестве аргумента для ядра 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];
/* img[private_history[i]] */ //Use it as you wish
}
Других решений пока нет …