OpenCL - 在数组的每n个元素中插入值

时间:2016-07-22 15:09:20

标签: opencl

我有一个包含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),
    &currentIndex);
printf("Kernel Arg currentIndex Factor status: %i \n", status);
  

如果您想知道为什么我使用带有两个元素的数组,那是因为我不确定如何引用单个变量。我刚刚以输入和输出数组的工作方式实现它。当我使用3的interpolateFactor运行内核时,currentIndex总是打印2。

1 个答案:

答案 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);

希望这有帮助。