OpenCL-在数组的每n个元素中插入值
我有一个100个元素的数组,我想做的是将这100个元素复制到另一个数组的每n个元素中 假设n是3 将值复制到每个第n个元素后,新数组将具有[val1 0 val2 0 val3 0…]。现在在opencl中,我尝试创建一个指向当前索引的指针,每次只需向该值添加n即可。但是,当前索引中始终保持相同的值。下面是我的代码OpenCL-在数组的每n个元素中插入值,opencl,Opencl,我有一个100个元素的数组,我想做的是将这100个元素复制到另一个数组的每n个元素中 假设n是3 将值复制到每个第n个元素后,新数组将具有[val1 0 val2 0 val3 0…]。现在在opencl中,我尝试创建一个指向当前索引的指针,每次只需向该值添加n即可。但是,当前索引中始终保持相同的值。下面是我的代码 __kernel void ddc(__global float *inputArray, __global float *outputArray, __const int int
__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运行内核时,currentIndex总是打印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);
希望这有帮助。就这么简单。再次感谢,真不敢相信我没有那样做。另外,关于3,你是对的,为了这个问题,我刚刚删除了内核中其他不必要的参数,但错过了编辑。