我遇到了一个奇怪的问题。 我有一个简单的内核。它工作正常。 我发现,如果我删除一些行或在opencl内核文件中引入一些错误,然后尝试运行该程序,程序运行正常,好像它有更正的代码,并没有给出任何错误。 但它应该在内核出错时给出错误。 因此,它无法检测错误,如果发现错误,则会使用之前正确版本的代码运行。 这是一个功能吗?什么错了?
答案 0 :(得分:3)
我强烈认为您忘记为代码中的每个openCL API添加OpenCL错误检查。如果您没有明确捕获错误,OpenCL内核将继续,就好像没有问题一样。 (在OpenCL编程中绝不应该错过这个)
如果您还没有完成错误检查,则可以按照以下方式完成(根据API调用而变化)
error=clGetPlatformIDs(1, &platform, &platforms);
if (error != CL_SUCCESS) {
printf("\n Error number %d", error);
}
正如您在评论中提到的,即使内核出错也是正确的值,这是因为设备内存或主机内存具有先前运行的结果(这可能会发生一段时间)。将输出缓冲区初始化为0,然后推送到gpu并回读,现在可能会看到乱码输出。
答案 1 :(得分:1)
这不是OpenCL的功能。我猜测原因是:
clCreateProgramWithSource
您认为自己提供的内核。{1}}检查此问题的一种好方法是在呼叫之前打印出您提供给clCreateProgramWithSource
的字符串。clCreateProgramWithBinary
而不是(修改的)内核源代码。答案 2 :(得分:1)
在内核运行甚至程序启动之间不会清除设备内存。由于您正在评论实际写入内存的代码,因此您只需获取上一次运行时写入的内容。使用NVIDIA GPU和较旧的驱动程序版本,我甚至看到了系统重启后的内存持久性。
为了确认这一点,您可以尝试分配几个缓冲区并使用之前未触及的缓冲区启动错误的内核。