2011-10-21 6 views
7

मैंने ओपनसीएल में थोड़ा सा काम किया है लेकिन हाल ही में "clBuildProgram" मेरे प्रोग्राम में से एक में विफल रहा है। मेरे कोड अंश नीचे है:clBuildProgram त्रुटि कोड -11 के साथ विफल रहा और बिना निर्माण लॉग

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

आम तौर पर पहले मैं वाक्य रचना या की मदद से गिरी फ़ाइल यहाँ के अंदर अन्य त्रुटियों "clGetProgramBuildInfo()" समारोह जब भी "clBuildProgram" विफल, लेकिन इस कार्यक्रम चलाता है जब, कंसोल पर मिला यह केवल प्रिंट:

कार्यक्रम बिल्ड में विफल रहा है --- लॉग बिल्ड ---

और जब मैं "clBuildProgram" द्वारा दिया त्रुटि कोड मुद्रित करने के लिए कोशिश की, यह "-11" है ...... मेरी कर्नेल फ़ाइल में समस्या क्या हो सकती है कि मुझे कोई बिल्ड विफल जानकारी नहीं मिलती है?

उत्तर

9

आप cl.h में खोज करके ओपनसीएल त्रुटि कोड का अर्थ सीख सकते हैं। इस मामले में, -11 वही है जो आप उम्मीद करेंगे, CL_BUILD_PROGRAM_FAILURE। यह निश्चित रूप से उत्सुक है कि बिल्ड लॉग खाली है। दो प्रश्न:

1.) clGetProgramBuildInfo से वापसी मूल्य क्या है?

2.) आप किस मंच पर हैं? यदि आप ऐप्पल के ओपनसीएल कार्यान्वयन का उपयोग कर रहे हैं, तो आप अपने पर्यावरण में CL_LOG_ERRORS = stdout सेट करने का प्रयास कर सकते हैं। उदाहरण के लिए, टर्मिनल से लिए:

$ CL_LOG_ERRORS = stdout ./myprog

यह भी Xcode (संपादित योजना -> तर्क -> पर्यावरण चर) में यह स्थापित करने के लिए बहुत आसान है।

3

आप सी के बजाय 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

मैं एक खाली लॉग फ़ाइल के साथ एक ही समस्या का सामना करना पड़ा। मैं अपने ओएलएल कर्नेल को एक अलग कंप्यूटर पर परीक्षण कर रहा था। इसके बजाय 2 प्लेटफॉर्म थे। एक इंटेल जीपीयू और एक एएमडी जीपीयू। मैं केवल एएमडी ओसीएल एसडीके स्थापित किया था। इंटेल ओसीएल एसडीके स्थापित करने से समस्या ठीक हो गई। इंटेल जीपीयू मंच के बजाय एएमडी मंच का चयन भी तय किया गया।

संबंधित मुद्दे