如果程序有效,OpenCL错误代码-44 CL_INVALID_程序如何出现?

如果程序有效,OpenCL错误代码-44 CL_INVALID_程序如何出现?,opencl,Opencl,在一些看似随机但可重复的情况下,program.build(…)返回错误-44,这意味着CL\u无效的程序,因此程序被认为是无效的。但是,程序是在上面的行中声明的,仅取决于上下文和源。我已经检查了源代码是否有效(内核代码中没有错误),并且上下文仅取决于设备,设备是否有效(在Nvidia Titan Xp和GTX 960M上测试)。那么,程序怎么可能无效呢 Context=Context(设备); 字符串kernel_code=opencl_code(); 程序::源代码; push_back({

在一些看似随机但可重复的情况下,
program.build(…)
返回错误
-44
,这意味着
CL\u无效的程序
,因此
程序
被认为是无效的。但是,
程序
是在上面的行中声明的,仅取决于
上下文
。我已经检查了
源代码
是否有效(内核代码中没有错误),并且
上下文
仅取决于
设备
设备
是否有效(在Nvidia Titan Xp和GTX 960M上测试)。那么,
程序
怎么可能无效呢

Context=Context(设备);
字符串kernel_code=opencl_code();
程序::源代码;
push_back({kernel_code.c_str(),kernel_code.length()});
程序=程序(上下文、源);
int error=program.build(“-cl-w”);

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

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

如果您可以在一个最小的、可复制的示例中(这意味着:不在完整应用程序的上下文中,并且没有任何多线程),那么您最好的希望是向NVidia提交一个bug


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

当我在同一GPU上从多个MPI线程运行内核时,这会与MPI一起发生(如果我只有1个GPU可用,则用于测试MPI并行化)。通常情况下,这是没有问题的。正如您所指出的,错误的根源似乎是线程问题,但我不知道从哪里开始搜索。在Windows上,英特尔的Inspector将是第一个解决方法。在Linux上,使用helgrind工具进行valgrind。