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

我有一个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 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),
    &currentIndex);
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,你是对的,为了这个问题,我刚刚删除了内核中其他不必要的参数,但错过了编辑。