LWJGL OpenCL MemoryStack堆栈空间不足

时间:2017-11-05 04:03:11

标签: opencl lwjgl

我试图创建一个简单的OpenCL程序来渲染颜色渐变。我有这个非常简单的OpenCL代码:

__kernel void colour_gradient(__global int* pixels, int width, int height)
{
    const int work_item_id = get_global_id(0);
    int x = work_item_id % width;
    int y = work_item_id / width;
    float fx = (float)x / (float)width;
    float fy = (float)y / (float)height;
    pixels[work_item_id] = (255 << 24) | (255 << 16) | ((int)(fx*255) << 8) | (int)(fy*255);
}

我正在从我的主机程序(使用LWJGL)中调用它,如下所示:

override def render(ctx: ContextHandle, queue: QueueHandle, kernel: KernelHandle, width: Int, height: Int): Array[Int] = {
  val memPixels = clCreateBuffer(ctx, CL_MEM_READ_WRITE, width*height*4, errcode)

  val ptr_memPixels = stack.callocPointer(1)
  ptr_memPixels.put(0, memPixels)

  checkCLError(clSetKernelArg(kernel, 0, ptr_memPixels))
  checkCLError(clSetKernelArg1i(kernel, 1, width))
  checkCLError(clSetKernelArg1i(kernel, 2, height))

  val globalWorkSize = stack.mallocPointer(1)
  globalWorkSize.put(0, width*height)
  clEnqueueNDRangeKernel(queue, kernel, 1, null, globalWorkSize, null, null, null)

  // read result
  val pixels = stack.calloc(width*height*4)
  checkCLError(clEnqueueReadBuffer(queue, memPixels, true, 0L, pixels, null, null))

  val result = new Array[Int](width*height)
  pixels.order(ByteOrder.LITTLE_ENDIAN)
  val ints = pixels.asIntBuffer()
  for {
    i <- 0 until ints.limit()
  } result(i) = ints.get(i)

  result
}

上面的代码会产生以下错误消息:

Caused by: java.lang.OutOfMemoryError: Out of stack space.
at org.lwjgl.system.MemoryStack.checkPush(MemoryStack.java:255)
at org.lwjgl.system.MemoryStack.nmalloc(MemoryStack.java:286)
at org.lwjgl.system.MemoryStack.ncalloc(MemoryStack.java:309)
at org.lwjgl.system.MemoryStack.calloc(MemoryStack.java:326)
at org.lwjgl.system.MemoryStack.calloc(MemoryStack.java:337)
at ColourGradient$.render(ColourGradient.scala:36)

如果我将widthheight减少到100 X 100,程序运行正常,任何大于此值,我收到此错误消息。

很明显,我的内存不足,只是不确定原因。

0 个答案:

没有答案