這是使用英特爾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