我试图创建一个简单的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)
如果我将width
和height
减少到100 X 100,程序运行正常,任何大于此值,我收到此错误消息。
很明显,我的内存不足,只是不确定原因。