这是使用英特尔SDK(1.5 x64)的OpenCL 1.1。 PyOpenCL 2011.2。我在Linux上(Fedora)。OpenCL:内核永远挂起,除非我删除参数
下面的代码打印"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"
,然后继续工作。但是,如果我删除第一个或第二个参数(即board
或board_size
),则程序将暂停并按照我的预期打印[1]
。
这是怎么回事?我如何按照我的意思进行这项工作?
编辑:超过350%的CPU使用率top
报告一致。如果我将board.shape
(即(10, 24)
)中的global_size替换为(1,)
(即一个维度中只有一个任务),那么我可以获得大约100%的CPU使用率。对我来说,这表明这一项任务正在运行,并且不停地忙碌循环,但我不知道为什么。对于这个任务,与10 * 24任务一样,如果我删除第一个或第二个参数,它将停止。
EDIT2::我敢肯定,这是PyOpenCL一个问题吗?我尽我所能地将示例移植到C,其结果可以找到here,但C示例没有挂起。任何人都可以发现一些差异或找出问题吗?
你问过pyopencl邮件列表/维护者吗?当我使用它时,它们非常敏感。 – 2012-04-29 19:32:32
@andrewcooke是的,在我将其缩小到PyOpenCL后,我发布到邮件列表。请参阅http://lists.tiker.net/pipermail/pyopencl/2012-April/001158.html – 2012-04-29 21:17:49
这是我得到的输出:DERP1,DERP2,DERP3和[1] – 2014-05-17 10:52:58