我有一个使用JOCL库(http://www.jocl.org/)的项目,并有多个模块.当我从命令行运行"./activator test",或在SBT控制台中运行"test"命令时,我收到如下错误:
[info] Exception encountered when attempting to run a suite with class name: pl.tarsa.sortalgobox.opencl.CpuMergeSortSpec *** ABORTED ***
[info] java.lang.UnsatisfiedLinkError: Error while loading native library "JOCL_0_1_9-linux-x86_64" with base name "JOCL_0_1_9"
[info] Operating system name: Linux
[info] Architecture : amd64
[info] Architecture bit size: 64
[info] ---(start of nested stack traces)---
[info] Stack trace from the attempt to load the library as a file:
[info] java.lang.UnsatisfiedLinkError: no JOCL_0_1_9-linux-x86_64 in java.library.path
[info] at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1865)
[info] at java.lang.Runtime.loadLibrary0(Runtime.java:870)
[info] at java.lang.System.loadLibrary(System.java:1122) …Run Code Online (Sandbox Code Playgroud) 运行Jocl(opencl包装器)内核会禁用java3d输出.当opencl完成时,java3d继续工作.
我怎样才能让Opencl(jocl)和opengl(java3d)一起工作?我需要一些告诉"它的opencl时间"的命令,当它完成时它告诉"它现在的opengl时间".
不知何故,当opencl工作时,java3D Jpanel会冻结并变灰.
我做了一些跟踪,发现java3D正在骚扰opencl(jocl),jmonkey引擎3.0并没有这样做.另一个尝试显示jmonkey做同样的事情.突然所有粒子位置都停止通过opencl更新,然后所有位置都变为0,0,0.
为每个设备使用唯一的上下文,程序,ID,....
误差如何:当星系渲染得很平滑时,突然所有粒子投射到我没有创建的平面上,然后在飞机投射到一条线上几秒后最终将该线投射到一个点上.所有这些必须是因为缓冲区x [] y [] z []开始为所有元素变为零.
编辑:较低的gpu工作频率使错误频率降低.这可能会比使用furmark更难推动GPU,因为在本地进行计算可以更快地工作吗?或者这是jocl/jmonkey/java3d之间的时间/访问优先级问题?所有其他程序,包括furmark,稳定在1225MHz(hd7870鹰)但这可能在1000MHz(AMD默认的hd7870)更稳定或看起来不稳定,因为缓冲区被垃圾收集故障破坏?
Aparapi(java的opencl包装器)从来都不是问题,在1200MHz下工作正常甚至还有"驱动程序停止运行并恢复"错误.催化剂13.3 beta.Jocl 1.5.1和累1.5.2.Catalyst 13.4 whql也是如此.
放System.gc(); 就在内核重复循环立即出现错误之前,必须有一个我错过的垃圾收集
使用一些跟踪:clCreateBuffer方法存在垃圾回收问题
编辑:解决了问题.当使用CL.CL_MEM_USE_HOST_PTR属性时,主线程中clCreateBuffer创建的缓冲区似乎是子线程的垃圾(要收集).CL.CL_MEM_COPY_HOST_PTR解决了问题,以换取%1-%2的性能损失
谢谢.
如果您正在运行的代码调用Java中的本机库,那么当内存分配应在对象的生命周期内持续时,释放这些库分配的内存的常用方法是什么?在C ++中,我将使用析构函数,但是Java从来没有真正使用过析构函数,现在更少了。
我最感兴趣的特定情况是JOCL,其中有一个对象,该对象包装已编译的OpenCL内核以及所有始终相同的参数。表示已编译内核和参数的结构都在库侧分配,JOCL提供了一种方法clReleaseMemObject,您可以调用该方法来递减指示何时应删除对象的引用计数器(请注意,这与直接释放内存有些不同,但在这种情况下,我基本上不这么认为。
我假设如果程序终止时该对象仍然存在,则操作系统将清除所有内容,但是我不确定线程中创建的对象。所以:
如果要在垃圾回收对象时释放本机内存,是否有合适的位置调用释放该内存的方法?
如果对象是将在线程持续时间内持续的对象,那么是否存在进行此调用的适当位置,或者甚至有必要这样做吗?
If I use a barrier (no matter if CLK_LOCAL_MEM_FENCE or CLK_GLOBAL_MEM_FENCE) in my kernel, it causes a CL_INVALID_WORK_GROUP_SIZE error. The global work size is 512, the local work size is 128, 65536 items have to be computed, the max work group size of my device is 1024, I am using only one dimension. For Java bindings I use JOCL.
The kernel is very simple:
kernel void sum(global float *input, global float *output, const int numElements, local float *localCopy
{ …Run Code Online (Sandbox Code Playgroud)