код ошибки (-11) :: каковы все возможные причины получения ошибки "cl_build_program_failure" в OpenCL? - PullRequest
15 голосов
/ 27 февраля 2012

Я использую графическую карту ATI RV770, OpenCl 1.0 и ati-stream-sdk-v2.3-lnx64 в Linux.

При выполнении моего кода хоста, который включает в себя следующие два раздела для сборки программы ядра, я получаю код ошибки (-11), т.е. cl_build_program_failure. Означает ли это, что программа ядра скомпилирована, если нет, то как она откомпилирована и отлажена?

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

/ * Создать объект программы из источника ядра ******* /

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

/ * Программа сборки (компиляции и связи) ******* /

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....

Функция чтения программы ядра выглядит следующим образом:

/ * читать исходный файл программы * /

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;

} // конец readKernelSource

Может кто-нибудь сказать, как это исправить?

Означает ли это, что это ошибка компиляции OpenCl во время выполнения или что-то еще?

// Печать информации build_log с использованием clGetProgramBuildInfo (), как показано ниже, но почему ничего не печатается?

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

1 Ответ

33 голосов
/ 27 февраля 2012

Эта ошибка обычно вызвана синтаксической ошибкой в ​​коде вашего ядра. Вы можете вызвать функцию OpenCL clGetProgramBuildInfo с флагом CL_PROGRAM_BUILD_LOG , чтобы получить доступ к журналу, созданному компилятором. Этот журнал содержит выходные данные, которые вы, вероятно, использовали при компиляции в командной строке (ошибки, предупреждения и т. Д.).

Например, вы можете добавить что-то похожее на следующее после вызова 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);
}

Для реального примера вы также можете увидеть функцию buildOpenCLProgram () в SDKCommon.cpp в SDK AMD APP.

...