我正在努力保存/加载二进制内核:如果我从源代码构建,程序运行正常。但是如果我编写并将内核加载到二进制文件中。我得到CL_INVALID_COMMAND_QUEUE,调用m_prog.getCommandQueues()[iDevice].enqueueNDRangeKernel
。我的平台在两种情况下(来自二进制,来自源)Intel和我的设备都是我的CPU。
也许有用的其他信息:
在CL_INVALID_COMMAND_QUEUE之前没有抛出异常(定义了__CL_ENABLE_EXCEPTIONS)
程序引用计数1
程序num devs 1
程序num devs 1
设备CL_BUILD_SUCCES
程序构建日志
设备构建已开始
设备构建完成
重新加载程序二进制对象。
/// write binaries to file
std::ofstream bfile(filenameGenerator(m_platform, fileName), std::ios::binary);
if (!bfile) return IT_CL_FILE_NOT_FOUND;
std::vector<size_t> sizes = m_prog.getInfo<CL_PROGRAM_BINARY_SIZES>();
std::vector<char*> binaries = m_prog.getInfo<CL_PROGRAM_BINARIES>();
bfile.write((char*)&sizes[0], sizeof(size_t));
bfile.write(binaries[0], sizes[0]);
delete[] binaries[0];
/// ... somewhere else ...
///read binaries from file
ifstream bfile(filenameGenerator(platform, fileName), std::ios::binary);
size_t n;
std::vector<char> buf;
bfile.read((char*)&n, sizeof(size_t));
buf.resize(n);
bfile.read(buf.data(), n);
m_prog = cl::Program(context, devs, cl::Program::Binaries(
1, std::make_pair(static_cast<const void*>(buf.data()), n)));
m_prog.build(devs);
/// later ...
m_prog.getCommandQueues()[iDevice].enqueueNDRangeKernel ///throws
编辑:添加了最后两行代码,以清除调用顺序
答案 0 :(得分:1)
程序在为特定设备构建时应该只有一个关联的命令队列。
尚未构建从二进制数据加载的程序,并且不清楚它是否有命令队列。
不建议调用m_prog.getCommandQueues()[device]
,因为您无法确定是否会返回队列。您应该在外部创建自己的队列,并在那里将程序排队。
答案 1 :(得分:0)
我自己找到了解决方案,我能够在不初始化vector<cl::CommandQueue>
时成功,只调整vector
的大小。