2016-07-22 43 views
1

我有一个100个元素的数组,我想要做的就是将这100个元素复制到另一个数组的每个第n个元素中。OpenCL - 在数组的每n个元素中插入值

假设n为3

新的阵列将有[VAL1 0 0 0值2 0 0 VAL3 0 ...]后的值复制到每个第n个元素。现在在opencl中,我尝试创建一个指向当前索引的指针,并且我只是每次将n添加到该值。但是,目前的指数总是保持相同的价值。以下是我的代码。对于CURRENTINDEX部分

__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]);  
} 

主机代码:

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.

回答

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

希望这有助于。

+0

那样容易。再次感谢,不敢相信我没有尝试过这种方式。另外,你说得对3,我只是为了这个问题删除了内核的其他不必要的参数,并且错过了编辑。 –

相关问题