PyOpenCL ПРЕДУПРЕЖДЕНИЕ: операция очистки завершилась неудачно (возможно, мертвый контекст?) В pyOpenCl FPGA - PullRequest
0 голосов
/ 27 марта 2020

У меня есть следующий код для многоядерного ядра OpenCl:

def matmul(batch, pad, dim, func):

act_values = {'linear' : 0, 'relu' : 1, 
              'sigmoid': 2, 'tan_h': 3,
              'softmax': 4}

act = act_values.get(func)
A, B, Bias, C_h, C_w, P_h, P_w, rows, cols, array_size = create_data(batch, pad, dim)

A_h, A_w = A.shape[0], A.shape[1]
B_h, B_w = B.shape[0], B.shape[1]

platforms = cl.get_platforms()
devices   = platforms[0].get_devices()
ctx       = cl.Context(devices)
binary    = open(file, 'rb').read()
prg       = cl.Program(ctx, devices, [binary]).build()

kernel_in  = prg.all_kernels()[1]
queue_in   = cl.CommandQueue(ctx, properties=cl.command_queue_properties.PROFILING_ENABLE)

kernel_out = prg.all_kernels()[0]
queue_out  = cl.CommandQueue(ctx, properties=cl.command_queue_properties.PROFILING_ENABLE)

kernel_in.set_scalar_arg_dtypes([None, None, None, None,
                             np.int32, np.int32,
                             np.int32, np.int32,
                             np.int32, np.float32])

kernel_out.set_scalar_arg_dtypes([None, np.int32, np.int32, np.int32, np.int32])

A_buff = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=A)
B_buff = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=B)
Bias_buff = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=Bias)

zeros_in   = aligned_zeros((C_h, C_w))
buffer_in  = cl.Buffer(ctx, mf.WRITE_ONLY, size=zeros_in.nbytes)
zeros_out  = aligned_zeros((P_h, P_w))
buffer_out = cl.Buffer(ctx, mf.WRITE_ONLY, size=zeros_out.nbytes)

event = kernel_in(queue_in, (C_w, C_h), (8, 8),
                    # Buffers para resultado, matriz A, B y vector de bías
                    buffer_in, A_buff, B_buff, Bias_buff,
                    # Buffer para la cache en la función softmax
                    A_h, A_w, B_w, act, 0, 0)

event_2 = kernel_out(queue_out, (1, 1) , (1, 1),
                   # Buffers para resultado, matriz A, B y vector de bías
                   buffer_out, rows, cols, pad,
                   # Buffer para la cache en la función softmax
                   batch)

cl.enqueue_copy(queue_out, zeros_out, buffer_out)

return zeros_out

Но когда ядра заканчивают sh, я получаю следующее предупреждение:

Trivial build
  warn(text, CompilerWarning)
PyOpenCL WARNING: a clean-up operation failed (dead context maybe?)
clReleaseEvent failed with code -58
PyOpenCL WARNING: a clean-up operation failed (dead context maybe?)
clReleaseEvent failed with code -58

И один из Два раза работает программа. Когда уже запущено ядро, выход равен нулю, и в следующий раз я снова получу предупреждение. Я использую эти флаги:

PYOPENCL_CTX=0
PYOPENCL_COMPILER_OUTPUT=1
CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=1

Использование event_2.wait() Проблема сохраняется. Это происходит только в pyOpenCL (python), а не в хост-программе c ++. Почему?

Спасибо!

...