2012-04-24 50 views
0

這是使用英特爾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",然後繼續工作。但是,如果我刪除第一個或第二個參數(即boardboard_size),則程序將暫停並按照我的預期打印[1]

這是怎麼回事?我如何按照我的意思進行這項工作?


編輯:超過350%的CPU使用率top報告一致。如果我將board.shape(即(10, 24))中的global_size替換爲(1,)(即一個維度中只有一個任務),那麼我可以獲得大約100%的CPU使用率。對我來說,這表明這一項任務正在運行,並且不停地忙碌循環,但我不知道爲什麼。對於這個任務,與10 * 24任務一樣,如果我刪除第一個或第二個參數,它將停止。


EDIT2::我敢肯定,這是PyOpenCL一個問題嗎?我盡我所能地將示例移植到C,其結果可以找到here,但C示例沒有掛起。任何人都可以發現一些差異或找出問題嗎?

+0

你問過pyopencl郵件列表/維護者嗎?當我使用它時,它們非常敏感。 – 2012-04-29 19:32:32

+0

@andrewcooke是的,在我將其縮小到PyOpenCL後,我發佈到郵件列表。請參閱http://lists.tiker.net/pipermail/pyopencl/2012-April/001158.html – 2012-04-29 21:17:49

+0

這是我得到的輸出:DERP1,DERP2,DERP3和[1] – 2014-05-17 10:52:58

回答

0

我把你的代碼剪切並粘貼到一個文本文件中,然後在我的系統上運行它,它運行得很好。

[email protected]:~$ python djhang.py 
DERP1 
DERP2 
DERP3 
[1] 
[email protected]:~$ 

我也注意到在你的代碼兩件事情,我不示例代碼或在我自己看。我使用元組的大小 - 一維內核的例子是(64),2D內核的例子是(64,64)。那對你有用嗎?另外,我在程序執行調用之後直接執行了wait()調用。數組的創建應該與OpenCL的東西正交,但我只是不喜歡它們之間有任何東西。

希望有幫助!