1

我们有一个在我的 OS X 机器上运行良好的 OpenCL 程序。我们刚刚设置了一台带有 Xeon Phi 和 Intel MPSS 的机器。然而,即使不使用 Phi 而是使用 Xeon CPU,CL_PROGRAM_BUILD_STATUS我们得到的是CL_BUILD_NONE.

不幸的是,我们找不到任何有关可能导致CL_BUILD_NONE. 你对如何调试这个有什么建议吗?

先感谢您!

版本:

[@memphis:~] $ cat /etc/SuSE-release 
SUSE Linux Enterprise Server 11 (x86_64)
VERSION = 11
PATCHLEVEL = 2

[@memphis:~] $ uname -a
Linux memphis 3.0.13-0.27-default #1 SMP Wed Feb 15 13:33:49 UTC 2012 (d73692b) x86_64 x86_64 x86_64 GNU/Linux

[@memphis:~] 1 $ rpm -qa |grep intel
intel-mic-2.1.6720-15.suse
intel-mic-mpm-2.1.6720-15.suse
opencl-1.2-intel-mic-3.0.67279-1
intel-mic-sysmgmt-2.1.6720-15.suse
intel-mic-kmod-2.1.6720-15.3.0.13.0.suse
intel-mic-gdb-2.1.6720-15.suse
intel-mic-flash-2.1.386-3.suse
intel-mic-cdt-2.1.6720-15.suse
opencl-1.2-intel-devel-3.0.67279-1
intel-mic-micmgmt-2.1.6720-15.3.0.13.0.suse
opencl-1.2-intel-cpu-3.0.67279-1
intel-mic-gpl-2.1.6720-15.suse
intel-mic-crashmgr-2.1.6720-15.suse
4

2 回答 2

1

的文档clGetProgramBuildInfo看起来很简单:

CL_BUILD_NONE. 如果没有对device的指定程序对象执行 clBuildProgram、clCompileProgram 或 clLinkProgram,则返回构建状态。

您提到您的程序在其他平台上工作,但也许您最终在平台之间的流程略有不同,导致这些方法没有在新流程中正确调用?我建议仔细验证之前调用的函数的返回值,看看你得到了你期望得到的结果。

于 2013-07-21T06:42:04.383 回答
1

找到了。我不知道为什么我有&retcl_int返回值)作为最后一个参数,而不是作为返回值clBuildProgram。移动它并将最后一个参数设置为 NULL 可以解决问题:

wrong:
clBuildProgram(*program, 1, &device_id, opts.str().c_str(), NULL, &ret);
correct:
ret = clBuildProgram(*program, 1, &device_id, opts.str().c_str(), NULL, NULL);

我明白为什么会出现这个问题——显然编译器/OpenCL 库明白我想使用pfn_notify和异步构建我的内核。但是,我不确定这种行为是否完全符合 OpenCL 文档:

If pfn_notify is NULL, clBuildProgram does not return until the build has completed.

在我的代码中,pfn_notify参数实际上是NULL,但是 user_data (错误地)不是。虽然我的代码没有任何意义,但我相信 user_data 在 is 时应该被pfn_notify忽略NULL

我在英特尔论坛上发布了这个,看看他们是否同意我对文档的解释。

于 2013-07-21T12:01:28.500 回答