从单独的文件中读取 OpenCL 内核
Read OpenCL kernel from seperate file
我正在尝试从文件 "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] = '[=10=]';
fread(source_str, sizeof(char), program_size, fp);
fclose(fp);
此代码适用于另一个项目,所以我不知道哪里出了问题。如果内核中的所有代码都在一行上,它似乎也可以工作。
任何帮助将不胜感激,谢谢! :)
MSDN page for fopen()
提到当文件以 "r"
作为模式字符串打开时,一些转换会发生在行尾。这意味着您查询的文件大小可能与 fread()
读取的数据量不匹配。这解释了为什么无效字符的数量等于文件中的行数(以及为什么它适用于一行中的所有代码)。
解决办法是用"rb"
标志打开文件:
fp = fopen("kernel.cl", "rb");
如果可以选择使用 C++,请查看 program::create_with_source_file()
method provided by the Boost.Compute 库。它简化了打开文件、读取内容以及使用源代码创建 OpenCL 程序对象的过程。
例如,您可以简单地做:
boost::compute::program my_program =
boost::compute::program::create_with_source_file("kernel.cl");
我正在尝试从文件 "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] = '[=10=]';
fread(source_str, sizeof(char), program_size, fp);
fclose(fp);
此代码适用于另一个项目,所以我不知道哪里出了问题。如果内核中的所有代码都在一行上,它似乎也可以工作。
任何帮助将不胜感激,谢谢! :)
MSDN page for fopen()
提到当文件以 "r"
作为模式字符串打开时,一些转换会发生在行尾。这意味着您查询的文件大小可能与 fread()
读取的数据量不匹配。这解释了为什么无效字符的数量等于文件中的行数(以及为什么它适用于一行中的所有代码)。
解决办法是用"rb"
标志打开文件:
fp = fopen("kernel.cl", "rb");
如果可以选择使用 C++,请查看 program::create_with_source_file()
method provided by the Boost.Compute 库。它简化了打开文件、读取内容以及使用源代码创建 OpenCL 程序对象的过程。
例如,您可以简单地做:
boost::compute::program my_program =
boost::compute::program::create_with_source_file("kernel.cl");