OpenCL:内核永远挂起,除非我删除参数

时间:2012-04-24 22:01:16

标签: python opencl pyopencl

这是OpenCL 1.1,使用英特尔SDK(1.5 x64)。 PyOpenCL 2011.2。我在Linux(Fedora)上。

以下代码打印"DERP1",但没有其他内容。

import pyopencl as cl
import numpy
import struct

ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)
mf = cl.mem_flags

board = numpy.zeros((10, 24), dtype=numpy.int8)
board_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=board)

can_move = numpy.zeros(1, dtype=numpy.int8)
can_move_buf = cl.Buffer(ctx, mf.READ_WRITE | mf.COPY_HOST_PTR, hostbuf=can_move)

program = cl.Program(ctx, """
__kernel void can_move(
    __global const char *board,
    const char2 board_size,
    __global char *can_move)
{
    *can_move = 1;
}
""").build()

move = program.can_move(queue, board.shape, None,
    board_buf, #__global const char *board,
    struct.pack('bb', 10, 24), #__global const char2 board_size
    can_move_buf) #__global *can_move



result = numpy.empty_like(can_move)
print "DERP1"
move.wait()
print "DERP2"
cl.enqueue_copy(queue, result, can_move_buf)
print "DERP3"

print result

打印"DERP1"然后继续工作。

但是,如果删除第一个或第二个参数(例如boardboard_size),程序会停止并按照我的预期打印[1]

发生了什么事?我如何按照我的意思来完成这项工作?


编辑 top报告超过350%的CPU使用率。如果我将global_size从board.shape(即(10, 24))替换为(1,)(即一维中只有一个任务),那么我的CPU使用率约为100%。对我而言,这表明这一项任务在不停止的情况下永远忙于循环运行,但我不知道为什么。对于这一项任务,与10 * 24任务一样,如果我删除第一个或第二个参数,它将停止。


edit2::我很确定这是PyOpenCL的问题?我尽可能地将示例移植到C,其结果可以找到here,但C示例不会挂起。任何人都可以发现一些差异或找出问题吗?

1 个答案:

答案 0 :(得分:0)

我将您的代码剪切并粘贴到一个文本文件中并在我的系统上运行,它运行得很好。

jmt@belle:~$ python djhang.py
DERP1
DERP2
DERP3
[1]
jmt@belle:~$ 

我确实注意到代码中有两件我在示例代码或我自己的代码中看不到的东西。我使用元组作为大小 - 例如对于1D内核是(64,),对于2D内核是(64,64,)。那对你有用吗?另外,我在程序执行调用之后直接调用wait()。数组创建应该与OpenCL的东西正交,但我不喜欢它们之间有任何东西。

希望有所帮助!