0

だから私はCUDAでこれを行う方法を知っていますが、基本的には、_global ptrの少数(0〜5、変数)を関数に渡し、それらのポインターをローカルまたはプライベートのいずれかにロードします(小さいため)数と、既にカーネルにローカル メモリ フェンスがあるという事実から判断すると、どちらが最速かはわかりません。これが機能するようになってから、実験的に決定します)。だから私はカーネルを次のように書きました:

__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. 好きなように3つのインデックスで操作します(整数操作)。
  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 に答える