У меня есть следующий код для многоядерного ядра 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 ++. Почему?
Спасибо!