Я изучаю OpenCL, следуя слайдам «HandsOnOpenCL», и когда я запускаю решение упражнения № 1014 * в версии 07, я получаю следующее сообщение об ошибке:
Traceback (most recent call last):
File "matmul.py", line 111, in <module>
mmul(queue, (N,), (ORDER/16,), N, d_a, d_b, d_c)
File "/home/zhenyu/.local/lib/python3.8/site-packages/pyopencl/__init__.py", line 840, in kernel_call
return self._enqueue(self, queue, global_size, local_size, *args, **kwargs)
File "<generated code>", line 74, in enqueue_knl_mmul
RuntimeError: Unable to cast Python instance to C++ type (compile in debug mode for details)
Я не знаю где неправильно в коде, потому что решение языковой версии C работает нормально.
Вот код python версии:
N = ORDER
kernelsource = open("../C_row.cl").read()
program = cl.Program(context, kernelsource).build()
mmul = program.mmul
mmul.set_scalar_arg_dtypes([numpy.int32, None, None, None])
print("\n===== OpenCL, matrix mult, C row per work item, order", N, "======\n")
# Do the multiplication COUNT times
for i in range(COUNT):
h_C.fill(0.0)
start_time = time()
mmul(queue, (N,), (ORDER/16,), N, d_a, d_b, d_c)
queue.finish()
run_time = time() - start_time
cl.enqueue_copy(queue, h_C, d_c)
results(N, h_C, run_time)
файл ядра C_row.cl
:
__kernel void mmul(
const int N,
__global float* A,
__global float* B,
__global float* C)
{
int k, j;
int i = get_global_id(0);
float tmp;
if (i < N) {
for (j = 0; j < N; j++) {
tmp = 0.0f;
for (k = 0; k < N; k++)
tmp += A[i*N+k] * B[k*N+j];
C[i*N+j] = tmp;
}
}
}
извините за мой плохой Engli sh