2012-04-24 67 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的东西正交,但我只是不喜欢它们之间有任何东西。

希望有帮助!