Это OpenCL 1.1, используя Intel SDK (1.5 x64). 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]
, как я ожидаю.
Что происходит? Как я могу сделать эту работу так, как я имел в виду?
редактировать:top
отчеты более 350% загрузки процессора последовательно. Если я заменил global_size от board.shape
(т. Е. (10, 24)
) до (1,)
(т. Е. Только одно задание в одном измерении), то я получаю около 100% использования ЦП. Для меня это означает, что эта одна задача выполняется навсегда занятой петлей без остановки, но я не знаю, почему. Для этой задачи, как и при задачах 10 * 24, если я удаляю первый или второй параметр, он останавливается.
edit2:: Я уверен, что это проблема с PyOpenCL? Я поместил пример как можно лучше, чтобы C, результаты которого можно найти here, но пример C не зависает. Может ли кто-нибудь обнаружить какую-то разницу или выяснить проблему?
вы спросили список почтовых отправлений pyopencl/сопровождающий. когда я использовал его, они были довольно отзывчивы. –
@andrewcooke Да, после того, как я сузил его до PyOpenCL, я отправил его в список рассылки. См. Http://lists.tiker.net/pipermail/pyopencl/2012-April/001158.html –
Это результат, который я получаю: DERP1, DERP2, DERP3 и [1] –