我有一个包含100个元素的数组,我想要做的是将这100个元素复制到另一个数组的每个第n个元素中。
假设n为3
在将值复制到每个第n个元素后,新数组将具有[val1 0 0 val2 0 0 val3 0 0 ...]。现在在opencl中,我尝试创建一个指向当前索引的指针,我只想每次都将n添加到此值。但是,当前索引始终只保留相同的值。以下是我的代码。
__kernel void ddc(__global float *inputArray, __global float *outputArray, __const int interpolateFactor, __global int *currentIndex){
int i = get_global_id(0);
outputArray[currentIndex[0]] = inputArray[i];
currentIndex[0] = currentIndex[0] + (interpolateFactor - 1);
printf("index %i \n", currentIndex[0]);
}
currentIndex部分的主机代码:
int *index;
index = (int*)malloc(2*sizeof(int));
index[0] = 0;
cl_mem currentIndex;
currentIndex = clCreateBuffer(
context,
CL_MEM_WRITE_ONLY,
2 * sizeof(int),
NULL,
&status);
status = clEnqueueWriteBuffer(
cmdQueue,
currentIndex,
CL_FALSE,
0,
2 * sizeof(int),
index,
0,
NULL,
NULL);
printf("Index enqueueWriteBuffer status: %i \n", status);
status |= clSetKernelArg(
kernel,
4,
sizeof(cl_mem),
¤tIndex);
printf("Kernel Arg currentIndex Factor status: %i \n", status);
如果您想知道为什么我使用带有两个元素的数组,那是因为我不确定如何引用单个变量。我刚刚以输入和输出数组的工作方式实现它。当我使用3的interpolateFactor运行内核时,currentIndex总是打印2。
答案 0 :(得分:2)
因此,如果我理解你想要做的是保存应该用于currentIndex的下一个索引。这不行。该值不会立即更新为其他工作项。如果你想这样做,你必须按顺序执行所有内核。
你能做的是
__kernel void ddc(__global float *inputArray, __global float *outputArray, __const int interpolateFactor, int start){
int i = get_global_id(0);
outputArray[start+i*(interpolateFactor-1)] = inputArray[i];
}
假设您可以从0以外的任何其他位置开始。否则您可以完全抛弃它。
让它像你那样工作
int start = 0;
status |= clSetKernelArg(
kernel,
3, // This should be 3 right? Might have been the problem to begin with.
sizeof(int),
&start);
希望这有帮助。