从单独的文件中读取OpenCL内核

时间:2015-03-18 11:57:51

标签: opencl

我正在尝试从文件“kernel.cl”读取一个OpenCL内核,但是我读过的内核一旦读完就会在程序结尾处出现未知符号。未知符号的数量与内核文件中的行数相同。

我用来获取内核的代码:

FILE *fp;
char *source_str;
size_t source_size, program_size;

fp = fopen("kernel.cl", "r");
if (!fp) {
    printf("Failed to load kernel\n");
    return 1;
}

fseek(fp, 0, SEEK_END);
program_size = ftell(fp);
rewind(fp);
source_str = (char*)malloc(program_size + 1);
source_str[program_size] = '\0';
fread(source_str, sizeof(char), program_size, fp);
fclose(fp);

此代码适用于另一个项目,所以我不知道出了什么问题。如果内核中的所有代码都在一行上,它似乎也可以工作。

任何帮助将不胜感激,谢谢! :)

2 个答案:

答案 0 :(得分:1)

MSDN page for fopen()提到当使用"r"作为模式字符串打开文件时,会发生关于行结尾的一些翻译。这意味着您查询的文件大小可能与fread()读取的数据量不匹配。这解释了为什么无效字符的数量等于文件中的行数(以及为什么它与一行中的所有代码一起工作)。

解决方案是使用"rb"标志打开文件:

fp = fopen("kernel.cl", "rb");

答案 1 :(得分:1)

如果使用C ++是一个选项,请查看program::create_with_source_file()库提供的Boost.Compute方法。它简化了打开文件,读取内容以及使用源代码创建OpenCL程序对象的过程。

例如,您可以这样做:

boost::compute::program my_program =
    boost::compute::program::create_with_source_file("kernel.cl");