2014-04-02 32 views
0

我遇到了一个奇怪的问题。 我有一个简单的内核。它工作正常。 我发现,如果我删除一些行或在opencl内核文件中引入一些错误,然后尝试运行该程序,则程序运行良好,就好像它具有更正的代码并且不会给出任何错误。 但是由于内核有错误,它应该会报错。 因此,它无法检测到错误,并且如果它发现错误,它将以先前正确版本的代码运行。 这是一个特色吗?这里有什么不对?即使内核有错误,Opencl运行正常

+0

请发布一些关于如何构建内核的代码。 – DarkZeros

回答

1

这不是OpenCL的功能。我猜测原因是:

  1. 你没有给你clCreateProgramWithSource你认为你给它的内核。检查这种方法的一个好方法是在打电话之前立即打印出您提供给clCreateProgramWithSource的字符串。
  2. 您的应用程序“缓存”内核,随后的执行使用clCreateProgramWithBinary而不是(修改后的)内核源代码。
+0

为了简单起见,我给内核分配了一些值和数组。像这样:c [iGID] = 111;如果我删除分号,程序仍会显示111.如果我更改c [iGID] = 222;并把分号放回去,我看到222.程序获得了相同的源代码。我尝试删除可执行文件并重新编译。但它仍然可以在内核中出现错误而完美运行。 – Luniam

+0

@Luniam似乎排除了我的第一个建议,然后 - 检查第二个? – Oak

+0

我已删除所有可执行文件并重新编译。所以,它应该作为一个新的开始,并应该得到在内核中所做的更改。顺便说一句,我没有在我的程序中使用clCreateProgramWithBinary。 – Luniam

2

我强烈地感觉到你忘了加OpenCL的错误检查每个OpenCL的API在你的代码,如果你没有捕获错误明确的OpenCL内核只会继续,如果没有问题。如果你还没有做错误检查,然后可以做如下(OpenCL中的程序应该不会错过这个)

(变化的基础上的API调用)

error=clGetPlatformIDs(1, &platform, &platforms); 
if (error != CL_SUCCESS) { 
     printf("\n Error number %d", error); 
} 

,你在你的评论中提及即使内核出现错误,也能获得正确的值,这是因为设备内存或主机内存具有上次运行的结果(这可能会发生一段时间)。初始化您的输出缓冲区为0,然后推到GPU并回读,现在可能会看到乱码输出。

+0

初始化0没有帮助。每当我运行内核时出错,我都会得到以前结果的结果。 opencl的自然工作方式?我没有使用clCreateProgramWithBinary。 – Luniam

+0

您是否应用了API错误检查?如果有的话,是否有任何失败?这不是OpenCL的工作方式,请转储您的代码以供进一步调查。 – Meluha

+0

嗨萨加尔,这是OpenCL的工作方式。如果你的内核有错误并且它没有运行,那么设备内存仍然保存着上一次成功运行代码的值。所以,你将拥有上一次运行的价值。 – Luniam

1

设备内存不会在内核运行或程序启动之间清除。由于您正在评论实际写入内存的代码,因此您只能获取上一次运行时写入的代码。使用NVIDIA GPU和较旧的驱动程序版本,我甚至在系统重启时看到了内存持久性。

为了证实这一点,您可以尝试分配多个缓冲区并使用先前未触及的缓冲区启动错误的内核。