2016-07-22 3 views
1

저는 100 개의 요소로 된 배열을 가지고 있는데,이 100 개의 요소를 다른 배열의 n 번째 요소에 복사하고 싶습니다. OpenCL - 배열의 모든 n 요소에 값을 입력하십시오.

새로운 배열 값이 매 n 번째 요소에 복사 하였다 VAL1을 val2 0 0 0 0 0 0 ... val3] 이후의 것라고하자 N 3

이었다. 이제 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은 항상 당신이 currentIndex에 사용하는 다음 인덱스를 저장되고 싶지 옳은 일을 이해 그래서 경우 2.

답변

2

를 인쇄한다. 이것은 작동하지 않습니다. 이 값은 다른 작업 항목에 대해 즉시 업데이트되지 않습니다. 이런 식으로하고 싶다면 순차적으로 모든 커널을 실행해야합니다. 당신이 무엇을 할 수 있는지

당신이 그렇지 않으면 당신은 그냥 완전히 도랑 수 0보다 다른 지점에서 시작할 수 있습니다 가정

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

입니다.

는 희망이 도움이

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에 대해 옳았습니다. 저는 질문을 위해서 커널에 대한 다른 불필요한 인수들을 삭제하고 있었고 그 편집을 놓쳤습니다. –

관련 문제