所以我知道如何在 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
。这样做的正确方法是什么?