我在下面创建了一个最小的示例来演示我的问题。
public class MinimalExample {
public static void main(String[] args) {
new MinimalExample().test();
}
@Test
public void test() {
CL.setExceptionsEnabled(true);
final cl_platform_id[] platforms = new cl_platform_id[1];
CL.clGetPlatformIDs(platforms.length, platforms, null);
System.out.println("Done");
}
}
当我将其作为应用程序运行时,我按预期获得输出“完成”。 当我将其作为junit测试运行时,我收到以下错误:
1) test(MinimalExample)
org.jocl.CLException: CL_PLATFORM_NOT_FOUND_KHR
at org.jocl.CL.checkResult(CL.java:787)
at org.jocl.CL.clGetPlatformIDs(CL.java:2152)
at MinimalExample.test(MinimalExample.java:15)
看来junit正在某种无法访问GPU的沙盒中运行。但是,我看到其他人通过junit测试成功运行了JOCL.org代码。示例:Correct way to setup and tear down an openCL unit test in a test suite?我不清楚有什么不同。有没有人知道任何沙盒可以解释这个?
编辑:如果重要,
$ java -version
openjdk version "1.8.0_66-internal"
OpenJDK Runtime Environment (build 1.8.0_66-internal-b17)
OpenJDK 64-Bit Server VM (build 25.66-b17, mixed mode)
$ uname -a
Linux machine-name 4.2.0-30-generic #36-Ubuntu SMP Fri Feb 26 00:58:07 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ nvidia-smi
Tue Mar 15 18:16:36 2016
+------------------------------------------------------+
| NVIDIA-SMI 352.63 Driver Version: 352.63 |
<truncated>
编辑#2;传奇继续: 我决定最好的做法是尽可能手动地接近问题。所以我手动运行它。
$ java -cp minimal_test.runfiles/external/hamcrest-all/jar/hamcrest-all-1.3.jar:minimal_test.runfiles/external/jocl/jar/jocl-0.2.0-RC00.jar:minimal_test.runfiles/external/junit/jar/junit-4.12.jar:minimal_test.runfiles/external/truth/jar/truth-0.27.jar:minimal_test.jar org.junit.runner.JUnitCore MinimalExample
JUnit version 4.12
.Done
Time: 0.112
OK (1 test)
它可以从命令行运行。它在eclipse中不起作用。它不适用于bazel。
编辑#3;
我希望等到完全解决方案,然后关闭它,但我提交的错误已经为bazel用例(但不是eclipse)产生了一个解决方法。将tags = ['local'],
添加到BUILD文件中可以在没有沙箱的情况下运行它,从而允许联系GPU。