程序有效怎么会出现OpenCL错误码-44 CL_INVALID_PROGRAM?

How can the OpenCL error code -44 CL_INVALID_PROGRAM appear if program is valid?

在一些看似随机但可重现的场合,program.build(...)returns错误-44CL_INVALID_PROGRAM,所以program应该是无效的。但是,program 在上面的行中声明,仅取决于 contextsource。我已经检查 source 是否有效(kernel_code 中没有错误)并且 context 仅取决于 device 并且 device 也有效(在 Nvidia Titan Xp 上测试和 GTX 960M)。那么program怎么会无效呢?

Context context = Context(device);
string kernel_code = opencl_code();
Program::Sources source;
source.push_back({ kernel_code.c_str(), kernel_code.length() });
Program program = Program(context, source);
int error = program.build("-cl-fast-relaxed-math -w");

通常是因为您已经在应用程序的早期将驱动程序置于不稳定状态。在处理图形 API 时,您需要特别注意线程问题(包括哪些 API 保证是线程安全的,哪些不是)和潜在的堆损坏(释放后使用,缓冲区溢出),后面的实现很容易损坏。

CL_INVALID_PROGRAM 和其他错误通常具有误导性,并且发生在明显不相关的时间点。具体来说,它们只是表示任何内部错误检查失败,但很少以有意义的方式映射。

如果你真的可以在一个最小的、可重现的例子中重现这个(这意味着:不是在一个完整的应用程序的上下文中,并且没有任何多线程)那么你最好的希望是向 NVidia 提交一个错误。

如果在最小示例中无法重现,那么几乎可以肯定是您在应用程序的其他地方导致了未定义的行为。