これは OpenCL 1.1 で、Intel 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"
してから作業を続けます。
ただし、最初または 2 番目のパラメーター (board
またはboard_size
) を削除すると、プログラムが停止し、[1]
期待どおりに出力されます。
何が起こっている?これを意図したとおりに機能させるにはどうすればよいですか?
編集: top
350% を超える CPU 使用率を一貫して報告します。global_size をboard.shape
(つまり(10, 24)
) から(1,)
(つまり、1 つの次元で 1 つのタスクのみ) に置き換えると、約 100% の CPU 使用率が得られます。私には、これは、この 1 つのタスクが停止せずに永遠にビジー ループを実行していることを示していますが、その理由はわかりません。この 1 つのタスクでは、10*24 タスクと同様に、最初または 2 番目のパラメーターを削除すると停止します。
edit2::これは PyOpenCL の問題だと思いますか? この例をできる限り C に移植しました。その結果はここにありますが、C の例はハングしません。誰かが違いを見つけたり、問題を解決したりできますか?