程序有效怎么会出现OpenCL错误码-44 CL_INVALID_PROGRAM?
How can the OpenCL error code -44 CL_INVALID_PROGRAM appear if program is valid?
在一些看似随机但可重现的场合,program.build(...)
returns错误-44
即CL_INVALID_PROGRAM
,所以program
应该是无效的。但是,program
在上面的行中声明,仅取决于 context
和 source
。我已经检查 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 提交一个错误。
如果在最小示例中无法重现,那么几乎可以肯定是您在应用程序的其他地方导致了未定义的行为。
在一些看似随机但可重现的场合,program.build(...)
returns错误-44
即CL_INVALID_PROGRAM
,所以program
应该是无效的。但是,program
在上面的行中声明,仅取决于 context
和 source
。我已经检查 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 提交一个错误。
如果在最小示例中无法重现,那么几乎可以肯定是您在应用程序的其他地方导致了未定义的行为。