C++ opencl内核文件未完全加载

C++ opencl内核文件未完全加载,c++,winforms,opencl,C++,Winforms,Opencl,一旦我的opencl内核文件超过了一定的长度,它就不能正确加载了。程序构建日志(CuBurdCudio)返回很多错误,其中好像有一行在中间(例如:代码> int测试;->错误未知标识符't')。 下面是我用来加载程序源的函数: char * load_program_source(const char *filename) { FILE *fh; char* source; long lSize; fh = fopen(filename, "r"); if (fh == 0)

一旦我的opencl内核文件超过了一定的长度,它就不能正确加载了。程序构建日志(CuBurdCudio)返回很多错误,其中好像有一行在中间(例如:代码> int测试;->错误未知标识符't')。 下面是我用来加载程序源的函数:

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

如果你能帮助我,我会很高兴的

试试下面的代码。如果没有帮助,请附加内核源代码

文件读取:

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;
}
项目大楼:

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

你试过“source=(char*)malloc(lSize+1);”而不是“source=(char*)malloc(lSize);”?@RomanArzumanyan刚刚试过。我在内核末尾添加了
//testtest
行以增加文件大小。错误仍然出现:
OCL2DFA.tmp.cl(629):警告:此声明没有存储类或类型说明符ttest^C:\Users\ASCHOE~1\AppData\Local\Temp\OCL2DFA.tmp.cl(629):错误:全局变量必须在addrSpace常量TTEST^的源代码末尾声明:错误:应为a“;“在编译“C:\Users\ASCHOE~1\AppData\Local\Temp\OCL2DFA.tmp.cl”时检测到2个错误”非常感谢。我的问题可以通过使用
Read\u Source\u File
函数来解决