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



这是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始终报告 CPU 使用率超过 350%。如果我从board.shape替换global_size(即 (10, 24) ) 到 (1,)(即一个维度中只有一个任务),然后我得到大约 100% 的 CPU 使用率。对我来说,这表明这个任务永远在不停地忙碌循环运行,但我不知道为什么。对于这一个任务,与 10*24 任务一样,如果我删除第一个或第二个参数,它将停止。


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

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

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

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

希望对您有所帮助!

最新更新