2013-09-24 245 views
3

當我在我的OpenCl代碼中使用clBuildProgram時,失敗時顯示錯誤代碼-11,沒有任何日誌信息。構建opencl內核失敗

這裏是我的代碼如下所示:

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

這裏是輸出的樣子:

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 

所以,只是偶然你們可以看到任何錯誤或東西怪異上面的線?

謝謝,

Éric。

+0

有人騙你。該設備是否可用,因爲您的infoinfo功能告訴您,或者它不可用,因爲'get_error_string(bldstatus)'說?更多的代碼? –

+0

我認爲這可能是我調用'clGetProgramBuildInfo'或我在'get_error_string'子例程中使用的錯誤代碼定義。實際上,'get_error_string'子例程返回對應於OpenCl錯誤代碼的字符串。該代碼可能不對應於cl_build_status代碼! – Eric

回答

6

它看起來像你可能會使用clGetProgramBuildInfo()錯誤。第一次被調用時,應該要告訴它需要在主機上的緩衝區的大小:

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

然後在主機上分配內存:

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

然後記得clGetProgramBuildInfo():

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

+0

我使用Austin建議更新了我的代碼。它像一個魅力。謝謝。 – Eric

+0

嗨Eric,幾乎所有查詢設備的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 .... 

所以,它的工作原理。

謝謝你的幫助。