2012-04-24 2 views
0

Это 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 не зависает. Может ли кто-нибудь обнаружить какую-то разницу или выяснить проблему?

+0

вы спросили список почтовых отправлений pyopencl/сопровождающий. когда я использовал его, они были довольно отзывчивы. –

+0

@andrewcooke Да, после того, как я сузил его до PyOpenCL, я отправил его в список рассылки. См. Http://lists.tiker.net/pipermail/pyopencl/2012-April/001158.html –

+0

Это результат, который я получаю: DERP1, DERP2, DERP3 и [1] –

ответ

0

Я вырезал и вставлял ваш код в текстовый файл и запускал его в своей системе, и он работал нормально.

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

В своем коде я заметил две вещи, которые я не вижу в примере кода или в своем собственном. Я использую кортежи для размеров - примеры будут (64,) для 1D ядра и (64,64) для 2D-ядра. Это работает для вас? Кроме того, я поместил вызов wait() сразу после вызова выполнения программы. Создание массива должно быть ортогональным к компонентам OpenCL, но мне просто не нравится что-то между ними.

Надеюсь, что это поможет!