2013-07-27 10 views
0

퍼즐 게임에 대해 무차별 방식 AI를 수행하기 위해 openCL 커널을 작성하고 있지만, 커널 코드 및/또는 보조 함수에 문제가 있습니다. 다음은 커널 코드입니다 (입력 값이 올바르게 전달되었음을 확신합니다). 60은 clEnqueueNDRangeKernel에 의해 설정된 전역 작업 크기입니다. 다음 openCL 보조 함수 호출이 작동하지 않습니다.

커널에 대한 입력

은 : 테스트 목적

__global 숯 *의 board_in // 60 개 보드

함유 큰 문자 어레이 // 더미 입력에

__global 숯 *

__global의 INT는 * 조회, // 나는 빨리 점수의 점수를 얻을하는 데 사용하는 배열

출력 이동 :

__global * CHAR 아웃 // 테스트 더미 출력

__global INT score_out * // 60 득점 Array : 한 각 보드

__global INT row_out * // 배열 용 findBestMove 함수는 다음과 같이 작동 ...

__kernel void helloworld(__global char* in, 
        __global char* board_in, 
        __global int* lookup, 
        __global char* out, 
        __global int * score_out, 
        __global int * row_out, 
        __global int * col_out) 
{ 

    int num = get_global_id(0); 
    char workingBoard[72]; 
    int scoreMat[64]; 
//set up the array for each thread to use 
    for(int k=0; k< 72; k++) 
    { 
     workingBoard[k] = board_in[num*BOARDSIZE+k]; 
    } 
// Make a copy of the score matrix for each thread to use 
    for(int j=0; j<64; j++) 
    { 
     scoreMat[j] = lookup[j]; 
    } 
    int s=0; 
    int r=0; 
    int c=0; 
    findBestMove(workingBoard,scoreMat,&s,1,&r,&c); 
    col_out[num] = ????????? 
    score_out[num] = ??????????? 
    row_out[num] = ??????????????? 
} 

(ITS 꽤 잘 60 행, 각 기판에 대해 하나의 60 COLS의 평가는

__global의 INT col_out * // 배열 테스트를 거쳤습니다. 나는 그것을 CPU 구현에서 잠시 사용했다.) : 보드 (문자 배열), 스코어 조회 배열, 이동 점수, 현재 깊이 및 행과 열의 포인터에 대한 포인터를 취한다. . 점수, 행 및 열을 설정해야합니다. 동일한 문서에서 정의한 다른 함수를 호출합니다. 내 커널 코드를 실행하면

// workerBoard and lookuparr are set previous to this to be the same as what 
//the kernel thread is supposed to have 
int s=0; 
int r=0; 
int c=0; 
findBestMove(workerBoard,lookuparr,&s,1,&r,&c); 
cout<<s<<","<<r<<","<<c<<endl; 

, 나는 함수 호출 과거를하지 않는 : 나는이 CPU에이 코드를 실행하면

, 나는 적절한 출력을 얻을. 이 함수는 커널과 같은 문서에서 정의되며 동적 메모리, 함수 포인터, 재귀 또는 전역 메모리 (커널 arg 외부)를 사용하지 않습니다. 일부 #define 문을 사용합니다.

???? 커널의 섹션을 r, c, s로 만들었지 만 언급했듯이 나는 거기에 가지 않는다. 중요한 실수를 저 지르고 있습니까 (참고 : 커널은 코드 검사기와 AMD 커널 분석기를 전달합니다). 또한, 저는 openCL에 매우 익숙합니다. 그래서 어떤 팁도 환영합니다. 이 질문에 대답하는 데 도움이되는 정보를 더 제공 할 수 있으면 알려주십시오.

+0

'findBestMove '기능 코드도 게시 할 수 있습니까? – CaptainObvious

+0

플러스 다른 기능은 ~ 500 라인입니다. 도움이 될 수도 있지만 여기에 많은 코드를 붙여두면 도움이 될지 모르겠습니다. – user2503981

+0

OK, "나는 함수 호출을 지나치게하지 않는다"는 것은 무엇을 의미합니까? 반환되는 오류가 있습니까? 그렇다면 오류 번호는 무엇입니까? 그렇지 않은 경우 어떻게됩니까? – CaptainObvious

답변

0

귀하의 의견에 따라 문제가 findBestMove 어딘가에있는 것 같습니다. 당신은 무한 루프가 있다면 BTW, 한 지점에서 감시 장치가 트리거하고 대부분의 경우 귀하의 드라이버가 검은 화면 또는 냉동 된 하나의 충돌이 발생합니다.

그래서 함수의 모든 코드에 주석을 달고 r, s, c 변수에 get_global_id 함수를 사용하여 이러한 특정 변수를 처리 한 작업 항목 ID와 같은 선택된 값을 지정하는 것이 좋습니다. 물론 ??? 다음을 입력하십시오 :

col_out[num] = c; 
    score_out[num] = s; 
    row_out[num] = r; 

적절한 값을 얻으면 기능을 디버깅하여 기능에 문제가 있는지를 알 수 있습니다.

여기에 몇 가지 팁을 부탁했기 때문에 성능을 향상시킬 수 있다고 생각했기 때문에 (버그를 수정 한 후에는 :) :) scoreMat 배열에 개인 메모리를 사용하는 대신 로컬 메모리를 사용하십시오. 이렇게하면 각 스레드가 전역 메모리의 동일한 데이터에 반복적으로 액세스하는 것을 피할 수 있습니다 (느림). 전역 메모리에서 로컬 메모리로 데이터를 가져 오려면 async_work_group_copy 함수를 사용할 수 있습니다. 당신은 이제 로컬 메모리를 사용을 고려하는 몇 가지 더 많은 코드를 변경해야 할 수도 있습니다

local int scoreMat[64]; 
event_t ev = async_work_group_copy(lookup, scoreMat, 64, 0); 
// Wait to make sure everything is copied 
wait_group_events (1, &ev); 

:

그래서 귀하의 경우이 같은이있을 것이다. 기본적으로 그것은 (보기의 액세스 포인트에서) 글로벌 하나와 같은 방식으로 작동하지만 훨씬 빠릅니다.

당신이 가지고있는 것과 다른 점은 60 개 (작업 항목 수)가 아니라 하나의 복사본 만 만들어진다는 것입니다. 또한 이번에는 글로벌 에서 가져온 데이터를 작업 그룹 내의 모든 작업 항목에서 액세스 할 수 있습니다. 각 작업 항목 앞에 자신의 복사본이 있습니다. 작업 그룹에서 이라는 사실을 강조하는 것도 중요합니다. 그러나 작업 항목을 60 개만 사용하기 때문에 작업 그룹이 하나만있을 가능성이 큽니다.

관련 문제