2011-04-29 6 views
1

저는 OpenCL을 사용하는 데있어서 아주 새로운 제품이며 매우 간단해야합니다.OpenCL을 사용하여 배열을 검색하고 플래그를 설정하십시오.

배열을 검사하고 특정 값을 찾기 위해 간단한 커널을 작성하고 있습니다. 그 값이 배열의 어디에서든지 발견되면 플래그를 설정하고 싶습니다. 값을 찾지 못하면 플래그는 0으로 유지됩니다.

은 현재 내가 커널 인수

clSetKernelArg(mCLKernels[1],1, sizeof(cl_mem), &outputFlag); 

로 설정하는 int

cl_mem outputFlag = clCreateBuffer(mCLContext, CL_MEM_WRITE_ONLY, sizeof(cl_int), NULL, NULL); 

을 유지하기 위해 cl_mem 객체를 생성하고 보이는 내 커널을 실행하고있어 같은 :

__kernel void checkForHole(__global uchar *image , __global int found, uchar holeValue) 
{ 
    int i = get_global_id(0); 
    int j = get_global_id(1); 

    uchar sample = image[i*j]; 

    if (sample == holeValue) { 
     found = 1; 
    } 
} 

내 배열은 2D이지만, 중요하지 않아야합니다.

발견 된 조건 안에 printf 문을 넣으면 호출됩니다 (값이 있음). 하지만 내 값을 다시 읽을 때 :

cl_int result; 

errorCode = clEnqueueReadBuffer(mCLCommandQueue, outputFlag, CL_TRUE 
           , 0, sizeof(cl_int), &result, 0, NULL, NULL); 

나는 0을 얻습니다. openCL에 플래그를 설정하는 적절한 방법이 있습니까? 전체 실행을 중단하고 발견 된 경우 내 값을 반환하는 방법이 있다면 또한 좋을 것입니다.

bool 반환 유형 커널을 작성하고 true를 반환 할 수 있습니까?

감사합니다.

답변

2

커널에서 출력 플래그는 int에 대한 포인터 여야합니다. INT의 *을 __global하는

변경 커널 매개 변수가

을 발견 나는 언제나 여기를 작성하여 내 문제를 알아낼

....

사람이 비록 실행을 중지하는 방법을 알고있는 경우, 또는 심지어 가능하다면 나는 여전히 관심이있을 것입니다.

+1

각 스레드가 배열의 한 요소 만 검색하는 경우 GPU로 보내면 실행을 중지 할 수 없습니다. – KLee1

+0

@ KLee1 왜? 더 복잡한 커널의 실행을 중지 할 수 있다면 간단한 커널의 실행을 중지하는 것이 왜 불가능합니까? –