だから私は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
。これを行う正しい方法は何ですか?