【发布时间】:2014-11-23 20:39:06
【问题描述】:
我有一个使用 AMD GPU 时运行良好的 OpenCL 应用程序。
使用 NVidia 卡时,调用 clBuildProgram 会使应用程序崩溃(甚至不返回失败值,只是崩溃)。调试时,崩溃产生:
nvopencl.dll 模块中的读取访问冲突。代码 0xc0000005。调试器将 clGetExportTable 函数(在 nvopencl.dll 中)指示为违规源。
通过评论内核的随机部分,我达到了这一点:
在代码片段中:
if (something){
//some stuff
float3 gradient = (float3)(0,1,0);
gradient = normalize(gradient);
return;
}
通过删除“gradient = normalize(gradient);”行, clBuildProgram 不会崩溃,但让它在那里,使程序崩溃。梯度变量甚至没有在内核内部使用,因此它与它的任何其他部分无关。而且 normalize 函数本身不应该是问题的根源,因为它在代码的其他部分使用。
我认为这可能与某些驱动程序错误有关。因为安装最新的 CUDA 版本 (6.5) 会使 NVidia 分发的 OpenCL Volume Rendering sample binaries 行为异常,而使用 CUDA 6 安装会使体积渲染示例正常工作。
我的代码与体渲染技术有关,这就是为什么我认为它可能是相关的,但我的问题出现在 CUDA 6.5 和 CUDA 6 安装中。
你有过类似的经历吗?问题的原因可能是什么,我该如何处理?
谢谢。
【问题讨论】:
-
如果您确定 normalize 在代码的其他部分中有效,我建议您尝试一些不同的渐变值来查看它是否是特定数字问题,但无论哪种方式,如果它适用于 amd 和不在 nvidia 上,这可能是一个错误,您应该向 nvidia 报告。