Проблема умножения матрицы с pyopencl - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь умножить две матрицы на pyopencl, используя личную память для хранения строки. Но когда я пытаюсь запустить свой код, он не проходит линию сборки. Я пытаюсь увидеть, происходит ли это от ядра, и кажется, что проблема заключается в использовании переменной tmp. Я пытаюсь заменить аффект простым шрифтом, но та же проблема, я не знаю, откуда это может быть.

N = 16
m1 = numpy.zeros((N,N), dtype=numpy.float32)
m2 = numpy.zeros((N,N), dtype=numpy.float32)
result = numpy.zeros((N,N), dtype=numpy.float32)

source = '''
kernel void prog(__global float* a, __global float* b, __global float* c, const int N)
{
    int j, k;
    int i = get_global_id(0);
    float tmp;
    float Awrk[1024];

    for(k = 0; k < N; k++) {
        Awrk[k] = a[i*N+k];
    }

    for(j = 0; j < N; j++) {
        tmp = 0.0f;
        for(k = 0; k < N; k++) {
            tmp += Awrk[k] * b[k*N+j];
        }

        //if I comment this line the code run, if I replace tmp by 0 the code run too. But if I try to use tmp, even in a print, the program just pause, but don't stop
        c[i*N+j] += tmp;
    }
}
'''

context = cl.create_some_context()
queue = cl.CommandQueue(context)
print("ok")
program = cl.Program(context, source).build()
print("ok2")

# create device buffers
mf = cl.mem_flags
d_a = cl.Buffer(context, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=m1)
d_b = cl.Buffer(context, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=m2)
d_c = cl.Buffer(context, mf.WRITE_ONLY, result.nbytes)

prog = program.prog
prog.set_scalar_arg_dtypes([None, None, None, numpy.uint32])
prog(queue, m1.shape, None, d_a, d_b, d_c, N)

# return results
cl.enqueue_copy(queue, result, d_c)

Спасибо за вашу помощь!

...