Итак, я знаю, как это сделать в 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
, Каков правильный способ сделать это?
Да, похоже, единственный способ сделать это в OpenCL для хранения img_history в непрерывной памяти, а это означает OpenCL просто не может обработать переменную длину список несмежных буферов. – IdeaHat