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

这也应该可以解决错误消息中包含整个在线源代码的问题。