Ошибка pyopencl в упражнении 07 "HandsOnOpenCL" - PullRequest
0 голосов
/ 07 марта 2020

Я изучаю 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

...