clGetKernelWorkGroupInfo中的JavaCL/OpenCL分段错误

clGetKernelWorkGroupInfo中的JavaCL/OpenCL分段错误,java,java-native-interface,segmentation-fault,opencl,Java,Java Native Interface,Segmentation Fault,Opencl,对于一个研究项目,我正在构建一个软件,它能够使用工作大小偏移将内核的执行分发到不同的OpenCL设备上。我正在使用JavaCL。出于某种原因,相同的分段错误不断出现: Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) C [libc++abi.dylib+0x25a13] __dynamic_cast+0x29 C [OpenCL+0x1c775] clGetKernelWork

对于一个研究项目,我正在构建一个软件,它能够使用工作大小偏移将内核的执行分发到不同的OpenCL设备上。我正在使用JavaCL。出于某种原因,相同的分段错误不断出现:

Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [libc++abi.dylib+0x25a13]  __dynamic_cast+0x29
C  [OpenCL+0x1c775]  clGetKernelWorkGroupInfo+0x9e1
C  [OpenCL+0x1ca64]  clEnqueueNDRangeKernel+0x65
C  [libbridj.dylib+0xd882]  dcCall_x64_sysv+0x61

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  com.nativelibs4java.opencl.library.OpenCLLibrary.clEnqueueNDRangeKernel(JJIJJJIJJ)I+0
...
我正在测试三个内核:Mandelbrot集、矩阵乘法和Conway的生命游戏。奇怪的是,Mandelbrot内核的所有功能都很好。另一个工作有时,有时我得到相同的输入配置SEGFULT。我能想到的它们之间的唯一区别是,Mandelbrot集不是在输入缓冲区上运行的,其他内核是。我不确定这是否会对这个问题产生影响。是什么导致了这个奇怪的错误

在所有情况下,本地工作大小参数都为null。设置值没有帮助。 所有内核只使用一个设备而不使用偏移即可正常工作 我正在开发MacBookPro,i7 2.6GHz,OSX 10.9.4。我正在使用的设备:

Device: HD Graphics 4000
Hardware version: OpenCL 1.2 
Driver version: 1.2(Jun  9 2014 13:24:09)
OpenCL version: OpenCL C 1.2 
Compute units: 16
Clock frequency: 1200
Maximum work item sizes: 512, 512, 512

Device: GeForce GT 650M
Hardware version: OpenCL 1.2 
Driver version: 8.26.26 310.40.45f01
OpenCL version: OpenCL C 1.2 
Compute units: 2
Clock frequency: 900
Maximum work item sizes: 1024, 1024, 64
源代码:

val globalWorkSizes =  Array(length.x, length.y)
val localWorkSizes:Array[Long] = null
val worksizeOffset = Array(offset.x, offset.y)
val result = clQueue.synchronized {
  val event = kernel.enqueueNDRange(clQueue, worksizeOffset, globalWorkSizes, localWorkSizes)
  val resultPointer = outBuffer.map(clQueue, CLMem.MapFlags.Read, offset, length, event)
  clQueue.flush()
  val floats = resultPointer.getFloats
  resultPointer.release()
  outBuffer.release()
  floats
}

好的,我查看了一个开源OpenCL实现pocl,以找出可能是什么导致了SEGL故障。结果是,ClenqueueEndRangeKernel调用clGetKernelWorkGroupInfo的方式如下:

size_t preferred_wg_multiple;
  cl_int retval = 
    POname(clGetKernelWorkGroupInfo)
    (kernel, command_queue->device, 
     CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, 
     sizeof (size_t), &preferred_wg_multiple, NULL);
这是我得到的唯一线索,我在内核上调用了JavaCL的getPreferredWorkGroupSizeMultiple,然后将其排入队列读取值,也许可以看到发生了什么:

val multiple = kernel.getPreferredWorkGroupSizeMultiple()(device)
Logger.debug("Multiple: " + multiple)
val event = kernel.enqueueNDRange(clQueue, worksizeOffset, globalWorkSizes, localWorkSizes)

奇怪的是,似乎只要调用这个函数就可以解决问题。我不确定这是否算是问题的答案,但它解决了问题。如果有人能想出一个合理的解释,我将不胜感激。

这两种设备中哪一种会产生此错误?您使用的是什么版本的JavaCL?我使用的是JavaCL 1.0.0-RC3。我只是做了一些单独的测试,问题出现在两台设备上。那个版本非常旧。请尝试上提供的最新版本。我已经尝试了maven存储库中更新的版本1.0-SNAPSHOT-结果相同。我刚从你的链接中尝试了jar,segfault不会消失…你能发布源代码吗?