2014-06-26 32 views
0

一旦我的opencl內核文件超過了一定的長度,就不能正確加載了。程序構建日誌(clBuildProgram)會返回很多錯誤,在行的中間似乎有削減(例如int test; - >錯誤未知標識符't')。opencl內核文件沒有完全加載

這裏是我將加載程序源的功能:

char * load_program_source(const char *filename) 
{ 

FILE *fh; 

char* source; 


long lSize; 



fh = fopen(filename, "r"); 
if (fh == 0) 
    return 0; 

//Get Filesize 
fseek(fh,0,SEEK_END); 
lSize = ftell(fh); 
rewind(fh); 

source = (char *) malloc(lSize); 
memset(source,'\0',lSize); 

fread(source, sizeof(char), lSize, fh); 

return source; 
} 

這裏是程序是構建代碼:

      //load program from file, compile kernels 
        cl_program program[1]; 
        cl_kernel kernel[13]; 
        const char * filename = "addKernel.c"; 
        char *program_source = load_program_source(filename); 
        program[0] = clCreateProgramWithSource(context, 1, (const char**)&program_source, 
         NULL, &err); 
        if (err == CL_OUT_OF_HOST_MEMORY){ 
         textBox1->Text += "Error: out of Host Memory!\r\n"; 
        } 
        else if (err == CL_INVALID_CONTEXT){ 
         textBox1->Text += "Error: invalid Context!\r\n"; 
        } 
        else if (err == CL_INVALID_VALUE){ 
         textBox1->Text += "Error: invalid Value!\r\n"; 
        } 


        err = clBuildProgram(program[0], 0, NULL, NULL, NULL, NULL); 
        textBox1->Text += "Program build error: " + err + "\r\n"; 
        cl_build_status status; 
        size_t logSize; 
        clGetProgramBuildInfo(program[0], deviceID[0], CL_PROGRAM_BUILD_STATUS, sizeof(cl_build_status), &status, NULL); 
        clGetProgramBuildInfo(program[0], deviceID[0], CL_PROGRAM_BUILD_LOG, 0, NULL, &logSize); 

        char* programLog; 
        programLog = (char*)calloc(logSize + 1, sizeof(char)); 
        clGetProgramBuildInfo(program[0], deviceID[0], CL_PROGRAM_BUILD_LOG, logSize + 1, programLog, NULL); 
        std::string tmp = std::string(programLog); 
        this->textBox1->Text += "Program build info: error=" + err + ", status=" + status + ", programLog:\r\n" + gcnew System::String(tmp.c_str()) + "\r\n" + "In case of an error please make sure that openCL has been initialized\r\n"; 

我會很高興,如果你cound幫我出來了!

+0

你嘗試「源=(的char *)malloc的(lSize所+ 1) ;」而不是「source =(char *)malloc(lSize);」 ? –

+0

@RomanArzumanyan剛剛嘗試過。我在內核的最後添加了'testtesttesttest'行來增加文件大小。錯誤仍然出現錯誤: 'OCL2DFA.tmp.cl(629):警告:該 聲明沒有存儲類或類型說明符 ttesttesttesttesttesttesttest ^ C:\用戶\ ASCHOE〜1個\應用程序數據\本地\溫度\ OCL2DFA.tmp.cl(629):error:global 變量必須在addrSpace中聲明常量 ttesttesttesttesttesttesttesttest ^ 源代碼結束:error:expected a「;」 編譯「C:\ Users \ ASCHOE〜1 \ AppData \ Local \ Temp \ OCL2DFA.tmp.cl」時檢測到2個錯誤。 ' – mTORjaeger

回答

1

請嘗試下面的代碼。如果沒有幫助,附上你的內核源代碼

文件閱讀:

static char* Read_Source_File(const char *filename) 
{ 
    long int 
     size = 0, 
     res = 0; 

    char *src = NULL; 

    FILE *file = fopen(filename, "rb"); 

    if (!file) return NULL; 

    if (fseek(file, 0, SEEK_END)) 
    { 
     fclose(file); 
     return NULL; 
    } 

    size = ftell(file); 
    if (size == 0) 
    { 
     fclose(file); 
     return NULL; 
    } 

    rewind(file); 

    src = (char *)calloc(size + 1, sizeof(char)); 
    if (!src) 
    { 
     src = NULL; 
     fclose(file); 
     return src; 
    } 

    res = fread(src, 1, sizeof(char) * size, file); 
    if (res != sizeof(char) * size) 
    { 
     fclose(file); 
     free(src); 

     return src; 
    } 

    src[size] = '\0'; /* NULL terminated */ 
    fclose(file); 

    return src; 
} 

PROGRAMM建築:

cl_int ret; 

program = clCreateProgramWithSource(
    context, 1, (const char**)&src_file, NULL, &ret); 

if(ret != CL_SUCCESS){ 
    fprintf(stderr, "Error with code %d happened.\n", ret); 
} 

// Warnings will be treated like errors, this is useful for debug 
char build_params[] = {"-Werror"};  
ret = clBuildProgram(program, 0, NULL, build_params, NULL, NULL); 

if (ret != CL_SUCCESS) 
{ 
    size_t len = 0; 
    char *buffer; 

    clGetProgramBuildInfo(program, 
     device_id, CL_PROGRAM_BUILD_LOG, 0, NULL, &len); 

    buffer = calloc(len, sizeof(char)); 

    clGetProgramBuildInfo(program, 
     device_id, CL_PROGRAM_BUILD_LOG, len, buffer, NULL); 

    fprintf(stderr, "%s\n", buffer); 

    free(buffer); 
} 
+0

非常感謝。我的問題可以通過使用'Read_Source_File'函數來解決 – mTORjaeger

+0

Always welcome :) –