2012-02-27 18 views
14

Tôi đang sử dụng card đồ họa ATI RV770, OpenCl 1.0 và ati-stream-sdk-v2.3-lnx64 trên Linux.mã lỗi (-11) :: tất cả các lý do có thể có lỗi là gì "cl_build_program_failure" trong OpenCL?

Trong khi chạy mã máy chủ lưu trữ của tôi bao gồm hai phần sau để xây dựng chương trình hạt nhân, tôi nhận được mã lỗi (-11) tức là cl_build_program_failure. Liệu nó có nghĩa là chương trình hạt nhân được biên dịch, nếu không thì nó được biên dịch và sửa lỗi như thế nào?

const char* KernelPath = "abc_kernel.cl"; //kernel program is in separate file but in same directory of host code.. 

/* Tạo đối tượng Chương trình từ nguồn kernel * ** * ** */

char* sProgramSource = readKernelSource(KernelPath); 
size_t sourceSize = strlen(sProgramSource) ; 
program = clCreateProgramWithSource(context, 1,(const char **) &sProgramSource,&sourceSize, &err); 
checkStatus("error while creating program",err); 

/* xây dựng (biên dịch & Link) Chương trình * ** * ***/

char* options = (char*)malloc(10*sizeof(char)); 
strcpy(options, "-g"); 
err = clBuildProgram(program, num_devices, devices_id, options, NULL, NULL); 
checkStatus("Build Program Failed", err); //This line throwing the error.... 

chức năng để đọc chương trình hạt nhân là như sau ::

tập tin

/* nguồn chương trình đọc */

char* readKernelSource(const char* kernelSourcePath){ 
FILE *fp = NULL; 
size_t sourceLength; 
char *sourceString ; 
fp = fopen(kernelSourcePath , "r"); 
if(fp == 0) 
{ 
     printf("failed to open file"); 
     return NULL; 
} 
// get the length of the source code 
fseek(fp, 0, SEEK_END); 
sourceLength = ftell(fp); 
rewind(fp); 
// allocate a buffer for the source code string and read it in 
sourceString = (char *)malloc(sourceLength + 1); 
if(fread(sourceString, 1, sourceLength, fp) !=sourceLength) 
{ 
      printf("\n\t Error : Fail to read file "); 
      return 0; 
} 
sourceString[sourceLength+1]='\0'; 
fclose(fp); 
return sourceString; 

} // kết thúc của readKernelSource

Có ai biết cách sửa nó không?

Liệu điều đó có nghĩa rằng đó là lỗi biên dịch OpenCl trong thời gian chạy hay cái gì khác?

// In thông tin build_log bằng cách sử dụng clGetProgramBuildInfo() như dưới đây, Nhưng tại sao lại không in được gì?

char * build_log; size_t log_size;

// First call to know the proper size 
     err = clGetProgramBuildInfo(program, devices_id, CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size); 
     build_log = (char*)malloc((log_size+1)); 

     // Second call to get the log 
     err = clGetProgramBuildInfo(program, devices_id, CL_PROGRAM_BUILD_LOG, log_size, build_log, NULL); 
     build_log[log_size] = '\0'; 
     printf("--- Build log ---\n "); 
     fprintf(stderr, "%s\n", build_log); 
     free(build_log); 
+0

Bạn đã dán nguồn hạt nhân vào công cụ của bên thứ ba thuộc loại nào chưa? Một hồ sơ có thể? Khi tôi gặp lỗi xây dựng, chúng thường là cú pháp trong chính chương trình. – mfa

Trả lời

30

Lỗi này thường do lỗi cú pháp trong mã hạt nhân của bạn gây ra. Bạn có thể gọi hàm OpenCL clGetProgramBuildInfo với cờ CL_PROGRAM_BUILD_LOG để truy cập nhật ký được tạo bởi trình biên dịch. Nhật ký này chứa đầu ra bạn có thể sử dụng để biên dịch trên dòng lệnh (lỗi, cảnh báo, v.v.).

Ví dụ, bạn có thể thêm một cái gì đó tương tự như sau sau khi bạn gọi clBuildProgram:

if (err == CL_BUILD_PROGRAM_FAILURE) { 
    // Determine the size of the log 
    size_t log_size; 
    clGetProgramBuildInfo(program, devices_id[0], CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size); 

    // Allocate memory for the log 
    char *log = (char *) malloc(log_size); 

    // Get the log 
    clGetProgramBuildInfo(program, devices_id[0], CL_PROGRAM_BUILD_LOG, log_size, log, NULL); 

    // Print the log 
    printf("%s\n", log); 
} 

Bạn cũng có thể xem các chức năng buildOpenCLProgram() trong SDKCommon.cpp trong AMD APP SDK cho một ví dụ thực tế.

+0

Tôi đã làm như vậy để in thông tin build_log như được hiển thị ở trên. Nhưng nó được in bất cứ điều gì, ngay cả tôi đã sử dụng malloc() để tạo ra lưu trữ cho build_log. – Gopal

+0

Tôi đoán bạn có nghĩa là "nó là ** không ** in bất cứ điều gì"? Bạn có thể xác nhận rằng printf đang thực sự được gọi? Bạn có thể cần phải khởi tạo nhật ký đầu tiên để đảm bảo rằng chuỗi là null-chấm dứt. Thử thêm "memset (log, 0, log_size);" sau cuộc gọi đến malloc. –

+0

tôi đã thử "memset ((void *) build_log, 0, sizeof (build_log));" nhưng tại dòng này nó được đưa ra lỗi phân đoạn ... – Gopal

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