2011-10-21 6 views
7

Ho lavorato un po 'in OpenCL ora, ma recentemente "clBuildProgram" non è riuscito in uno dei miei programmi. Il mio codice brano è qui sotto:clBuildProgram non riuscito con codice errore -11 e senza registro build

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

Normalmente in precedenza ho avuto la sintassi o altri errori all'interno del file del kernel qui con l'aiuto di "clGetProgramBuildInfo()" la funzione ogni volta che "clBuildProgram" Impossibile, ma quando questo programma viene eseguito, su console solo stampe:

Programma generazione non riuscita --- --- costruire registro

E quando ho provato a stampare il codice di errore restituito da "clBuildProgram"; è "-11" ...... Quale può essere il problema con il mio file del kernel che non ottengo informazioni sulla mancata compilazione?

risposta

9

È possibile conoscere il significato dei codici di errore OpenCL effettuando una ricerca in cl.h. In questo caso, -11 è proprio quello che ti aspetteresti, CL_BUILD_PROGRAM_FAILURE. È certamente curioso che il log di compilazione sia vuoto. Due domande:

1.) Qual è il valore restituito da clGetProgramBuildInfo?

2.) Che piattaforma sei? Se stai utilizzando l'implementazione OpenCL di Apple, potresti provare a impostare CL_LOG_ERRORS = stdout nel tuo ambiente. Ad esempio, dal Terminal:

$ CL_LOG_ERRORS = stdout ./myprog

E 'anche abbastanza facile da impostare questo in Xcode (Modifica schema -> Argomenti -> Variabili d'ambiente).

3

Se si utilizza il C invece di 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

ho incontrato lo stesso problema con un file di registro vuoto. Stavo testando il mio kernel ocl su un altro computer. Aveva 2 piattaforme invece di una. Una GPU Intel e una GPU AMD. Ho solo installato AMD OCL SDK. L'installazione di Intel OCL SDK ha risolto il problema. Anche la scelta della piattaforma AMD invece della piattaforma Intel GPU lo ha risolto.

Problemi correlati