0

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

4

1 回答 1

0

我不知道你在 CUDA 中的表现如何。但这完全禁止作为 OpenCL 内核的参数。

您不能将指针值复制到设备然后直接使用它,因为内存地址不同。

为了做到这一点,您需要:

  1. 仅复制引用图像表的 img_history 的索引(不是指针)。
  2. 根据需要使用 thouse 索引进行操作(整数操作)。
  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
}
于 2013-09-17T15:18:09.793 回答