2013-09-24 3 views
3

clBuildProgram을 OpenCl 코드에 사용하면 로그 정보없이 오류 코드 -11과 함께 실패합니다.opencl 커널 빌드 실패

Error -11: Failed to build program executable [ CL_BUILD_PROGRAM_FAILURE ] 
Build Status 0: CL_SUCCESS 
INFO: CL_DEVICE_NOT_AVAILABLE 
Build Options 0: CL_SUCCESS 
INFO: 
Build Log -30: CL_INVALID_VALUE 


CL_PLATFORM_NAME : NVIDIA CUDA 
CL_PLATFORM_VERSION : OpenCL 1.1 CUDA 4.2.1 
Device name : Tesla K20m 
Driver version : 319.32 
Global Memory (MB) : 4799 
Global Memory Cache (KB) : 208 
Local Memory (KB) : 48 
Max clock (MHz) : 705 
Max Work Group Size : 1024 
Number of parallel compute cores : 13 
Is the device available : yes 

그래서, 그냥 우연히 너희들은 어떤 실수 나 이상한 것을 볼 수 있습니다

다음
ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL); 

    if (ret != CL_SUCCESS) 
    { 
     size_t len; 
     char buffer[2048]; 
    cl_build_status bldstatus; 
    printf("\nError %d: Failed to build program executable [ %s ]\n",ret,get_error_string(ret)); 
     ret = clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_STATUS, sizeof(bldstatus), (void *)&bldstatus, &len); 
     printf("Build Status %d: %s\n",ret,get_error_string(ret)); 
    printf("INFO: %s\n", get_error_string(bldstatus)); 
     ret = clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_OPTIONS, sizeof(buffer), buffer, &len); 
     printf("Build Options %d: %s\n",ret,get_error_string(ret)); 
    printf("INFO: %s\n", buffer); 
     ret = clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &len);  
    printf("Build Log %d: %s\n",ret,get_error_string(ret)); 
    printf("%s\n", buffer); 
    (void)infoinfo(platform_id,device_id); 
    exit(1); 
    } 

같이 출력이 모습입니다 : 여기

내 코드는 모습입니다 위의 줄?

감사합니다.

Éric.

+0

누군가가 당신에게 거짓말을한다. 'get_error_string (bldstatus)'가 말했듯이, infoinfo funktion이 알려주거나 사용할 수 없기 때문에 장치를 사용할 수 있습니까? 좀 더 코드? –

+0

'clGetProgramBuildInfo' 또는'get_error_string' 서브 루틴에서 사용하는 에러 코드 정의를 호출하는 방법 중 하나라고 생각합니다. 사실,'get_error_string' 서브 루틴은 OpenCl 에러 코드에 해당하는 문자열을 반환합니다. 이 코드는 cl_build_status 코드와 일치하지 않을 수 있습니다! – Eric

답변

6

clGetProgramBuildInfo()를 잘못 사용하신 것 같습니다. 다음

char *log = new char[len] //or whatever you use

: clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, NULL, NULL, &len);

다음 호스트의 메모리를 할당 :가 호출 될 때 처음으로, 그것은 호스트에 필요한 버퍼의 크기를 이야기해야한다 clGetProgramBuildInfo()를 호출 :

clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, len, log, null);

+0

오스틴 조언을 사용하여 코드를 업데이트했습니다. 그것은 매력처럼 작동합니다. 고맙습니다. – Eric

+0

안녕하세요 에릭, 장치를 쿼리하는 OpenCL 함수의 거의 모든 기능은 다음과 같습니다. 장치에서 정보의 크기를 요청하고, 호스트에 메모리를 할당하고, 장치에서 호스트로 정보를 복사합니다. – Austin

0

나는 코드를 수정 한 버퍼 크기 증가 : 지금이 얻을

ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL); 

    if (ret != CL_SUCCESS) 
    { 
     size_t len; 
     char buffer[204800]; 
    cl_build_status bldstatus; 
    printf("\nError %d: Failed to build program executable [ %s ]\n",ret,get_error_string(ret)); 
     ret = clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_STATUS, sizeof(bldstatus), (void *)&bldstatus, &len); 
     if (ret != CL_SUCCESS) 
      { 
     printf("Build Status error %d: %s\n",ret,get_error_string(ret)); 
     exit(1); 
     }  
    if (bldstatus == CL_BUILD_SUCCESS) printf("Build Status: CL_BUILD_SUCCESS\n"); 
    if (bldstatus == CL_BUILD_NONE) printf("Build Status: CL_BUILD_NONE\n"); 
    if (bldstatus == CL_BUILD_ERROR) printf("Build Status: CL_BUILD_ERROR\n"); 
    if (bldstatus == CL_BUILD_IN_PROGRESS) printf("Build Status: CL_BUILD_IN_PROGRESS\n"); 
     ret = clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_OPTIONS, sizeof(buffer), buffer, &len); 
     if (ret != CL_SUCCESS) 
      { 
     printf("Build Options error %d: %s\n",ret,get_error_string(ret)); 
     exit(1); 
     }   
    printf("Build Options: %s\n", buffer); 
     ret = clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &len);  
     if (ret != CL_SUCCESS) 
      { 
     printf("Build Log error %d: %s\n",ret,get_error_string(ret)); 
     exit(1); 
     }  
    printf("Build Log:\n%s\n", buffer); 
    exit(1); 
    } 

을 :

Error -11: Failed to build program executable [ CL_BUILD_PROGRAM_FAILURE ] 
Build Status: CL_BUILD_ERROR 
Build Options: 
Build Log: 
:4:85: error: must specify .... 

그래서, 그것은 작동합니다.

도움 주셔서 감사합니다.