如果从二进制加载,OpenCL会导致CL_INVALID_COMMAND_QUEUE

时间:2015-05-27 09:36:46

标签: c++ runtime-error opencl

我正在努力保存/加载二进制内核:如果我从源代码构建,程序运行正常。但是如果我编写并将内核加载到二进制文件中。我得到CL_INVALID_COMMAND_QUEUE,调用m_prog.getCommandQueues()[iDevice].enqueueNDRangeKernel。我的平台在两种情况下(来自二进制,来自源)Intel和我的设备都是我的CPU。

也许有用的其他信息:

  1. 在CL_INVALID_COMMAND_QUEUE之前没有抛出异常(定义了__CL_ENABLE_EXCEPTIONS)

  2. 程序引用计数1

  3. 程序num devs 1

  4. 程序num devs 1

  5. 设备CL_BUILD_SUCCES

  6. 的程序构建状态
  7. 程序构建日志

    • 设备构建已开始

    • 设备构建完成

    • 重新加载程序二进制对象。

  8. /// 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
    

    编辑:添加了最后两行代码,以清除调用顺序

2 个答案:

答案 0 :(得分:1)

程序在为特定设备构建时应该只有一个关联的命令队列。

尚未构建从二进制数据加载的程序,并且不清楚它是否有命令队列。

不建议调用m_prog.getCommandQueues()[device],因为您无法确定是否会返回队列。您应该在外部创建自己的队列,并在那里将程序排队。

答案 1 :(得分:0)

我自己找到了解决方案,我能够在不初始化vector<cl::CommandQueue>时成功,只调整vector的大小。