0

これは 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 の例はハングしません。誰かが違いを見つけたり、問題を解決したりできますか?

4

1 に答える 1

0

あなたのコードをカット アンド ペーストしてテキスト ファイルに貼り付け、自分のシステムで実行したところ、問題なく実行されました。

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

あなたのコードには、サンプル コードや私自身のコードには見られない 2 つの点があることに気付きました。サイズにはタプルを使用します。たとえば、1D カーネルの場合は (64,)、2D カーネルの場合は (64,64,) です。それはあなたのために働きますか?また、プログラム実行呼び出しの直後に wait() 呼び出しを配置し​​ました。配列の作成は OpenCL のものと直交する必要がありますが、それらの間に何かがあるのは好きではありません。

それが役立つことを願っています!

于 2012-12-27T20:11:32.597 に答える