Я пытаюсь умножить две матрицы на 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)
Спасибо за вашу помощь!