2011-10-21 30 views
7

Tôi đã làm việc một chút trong OpenCL bây giờ nhưng gần đây "clBuildProgram" không thành công trong một chương trình của tôi. Đoạn mã của tôi là dưới đây:clBuildProgram không thành công với mã lỗi -11 và không có nhật ký dựng

cl_program program; 
program = clCreateProgramWithSource(context, 1, (const char**) &kernel_string, NULL, &err); 
if(err != CL_SUCCESS) 
{ 
cout<<"Unable to create Program Object. Error code = "<<err<<endl; 
exit(1); 
} 
if(clBuildProgram(program, 0, NULL, NULL, NULL, NULL) != CL_SUCCESS) 
{ 
cout<<"Program Build failed\n"; 
size_t length; 
char buffer[2048]; 
clGetProgramBuildInfo(program, device_id[0], CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &length); 
cout<<"--- Build log ---\n "<<buffer<<endl; 
exit(1); 
} 

Thông thường trước đó tôi đã cú pháp hoặc các lỗi khác trong tập tin kernel ở đây với sự giúp đỡ của "clGetProgramBuildInfo()" chức năng bất cứ khi nào "clBuildProgram" Không nhưng khi chương trình này chạy trên giao diện điều khiển nó chỉ in:

Chương trình xây dựng thất bại --- Xây dựng log ---

Và khi tôi đã cố gắng để in các mã lỗi trả về bởi "clBuildProgram"; nó là "-11" ...... Điều gì có thể là vấn đề với tập tin hạt nhân của tôi mà tôi không nhận được bất kỳ thông tin xây dựng thất bại?

Trả lời

9

Bạn có thể tìm hiểu ý nghĩa của mã lỗi OpenCL bằng cách tìm kiếm trong cl.h. Trong trường hợp này, -11 chỉ là những gì bạn mong đợi, CL_BUILD_PROGRAM_FAILURE. Nó chắc chắn tò mò rằng nhật ký xây dựng là trống rỗng. Hai câu hỏi:

1.) Giá trị trả về từ clGetProgramBuildInfo là gì?

2.) Bạn đang sử dụng nền tảng nào? Nếu bạn đang sử dụng triển khai OpenCL của Apple, bạn có thể thử đặt CL_LOG_ERRORS = stdout trong môi trường của mình. Ví dụ, từ Terminal:

$ CL_LOG_ERRORS = stdout ./myprog

Nó cũng khá dễ dàng để thiết lập này trong Xcode (Sửa Scheme -> Arguments -> Environment Variables).

3

Nếu bạn đang sử dụng C thay vì C++:

err = clBuildProgram(program, 0, NULL, NULL, NULL, NULL); 

////////////////Add the following lines to see the log file/////////// 

if (err != CL_SUCCESS) { 
char *buff_erro; 
cl_int errcode; 
size_t build_log_len; 
errcode = clGetProgramBuildInfo(program, devices[0], CL_PROGRAM_BUILD_LOG, 0, NULL, &build_log_len); 
if (errcode) { 
      printf("clGetProgramBuildInfo failed at line %d\n", __LINE__); 
      exit(-1); 
     } 

    buff_erro = malloc(build_log_len); 
    if (!buff_erro) { 
     printf("malloc failed at line %d\n", __LINE__); 
     exit(-2); 
    } 

    errcode = clGetProgramBuildInfo(program, devices[0], CL_PROGRAM_BUILD_LOG, build_log_len, buff_erro, NULL); 
    if (errcode) { 
     printf("clGetProgramBuildInfo failed at line %d\n", __LINE__); 
     exit(-3); 
    } 

    fprintf(stderr,"Build log: \n%s\n", buff_erro); //Be careful with the fprint 
    free(buff_erro); 
    fprintf(stderr,"clBuildProgram failed\n"); 
    exit(EXIT_FAILURE); 
} 
0

tôi gặp phải vấn đề tương tự với một tập tin log trống. Tôi đã thử nghiệm hạt nhân ocl của tôi trên một máy tính khác. Nó có 2 nền tảng thay vì một nền tảng. Một GPU Intel và một GPU AMD. Tôi chỉ có AMD OCL SDK được cài đặt. Cài đặt Intel OCL SDK đã khắc phục được sự cố. Cũng chọn nền tảng AMD thay vì nền tảng GPU Intel đã sửa nó.

Các vấn đề liên quan