OpenCL 日志文件定位错误,就好像代码是一个长行
OpenCL log file locates errors as if the code was a single long line
我生成一个日志文件(在 OSX 上使用 OpenCL)做
void printErrors(const Program& program, const Device& device){
string buildlog = program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(device);
ofstream file("./error.txt");
file << buildlog << endl;
file.close();
}
但是生成的文件似乎将代码解释为一行非常长的代码。例如,错误位于 <program source>:1:10604:
。这对于调试来说不是很方便。你知道如何获得像 <program source>:line:column:
这样的好位置吗?
顺便说一下,对于每个 error/warning,整个程序都被复制到日志文件中。你知道如何避免这种行为吗?
源码是这样生成的:
ifstream file("./kernel.cl");
string source;
while (!file.eof()){
char line[256];
file.getline(line, 255);
source += line;
}
const char* kernel_source = source.c_str();
program = Program(context, kernel_source);
int result = program.build(device);
if (result == CL_BUILD_PROGRAM_FAILURE) printErrors(program, device);
而且文件kernel.cl真的很标准,每行末尾都有分号。
我认为你的问题出在这里:
char line[256];
file.getline(line, 255);
source += line;
getline
将不包括换行符,因此您需要显式插入它们。试试这个:
source += line;
source += "\n";
这也应该可以解决错误消息中包含整个在线源代码的问题。
我生成一个日志文件(在 OSX 上使用 OpenCL)做
void printErrors(const Program& program, const Device& device){
string buildlog = program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(device);
ofstream file("./error.txt");
file << buildlog << endl;
file.close();
}
但是生成的文件似乎将代码解释为一行非常长的代码。例如,错误位于 <program source>:1:10604:
。这对于调试来说不是很方便。你知道如何获得像 <program source>:line:column:
这样的好位置吗?
顺便说一下,对于每个 error/warning,整个程序都被复制到日志文件中。你知道如何避免这种行为吗?
源码是这样生成的:
ifstream file("./kernel.cl");
string source;
while (!file.eof()){
char line[256];
file.getline(line, 255);
source += line;
}
const char* kernel_source = source.c_str();
program = Program(context, kernel_source);
int result = program.build(device);
if (result == CL_BUILD_PROGRAM_FAILURE) printErrors(program, device);
而且文件kernel.cl真的很标准,每行末尾都有分号。
我认为你的问题出在这里:
char line[256];
file.getline(line, 255);
source += line;
getline
将不包括换行符,因此您需要显式插入它们。试试这个:
source += line;
source += "\n";
这也应该可以解决错误消息中包含整个在线源代码的问题。