我在下面创建了一个最小的示例来演示我的问题。
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 代码。示例:在测试套件中设置和拆除 openCL 单元测试的正确方法? 我不清楚有什么不同。有谁知道任何可以解释这一点的沙盒?
编辑:如果重要的话,
$ 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)
它从命令行工作。它在日食中不起作用。它不适用于bazel。
编辑#3;
我希望在关闭它之前等待完整的解决方案,但我提交的错误已经为 bazel 用例(但不适用于 eclipse)提供了一种解决方法。添加tags = ['local'],
到 BUILD 文件可以在没有沙箱的情况下运行它,从而可以联系 GPU。