Мой Intel GPU имеет 40 шейдерных блоков, 64-битную ширину и поддержку Opencl 1.2,. Например, мне нужно вычислить что-то вроде:
c[gid] = a[gid] + b[gid];
Мне нужно равномерно разделить эту задачу на 40 единиц. Как это сделать? Также мне нужны предложения, как оптимизировать некоторый код для определенного количества внутренних процессоров графического процессора. Полный код примера:
from __future__ import absolute_import
from __future__ import print_function
import pyopencl as cl
import pyopencl.array as cl_array
import numpy
import numpy.linalg as la
a = numpy.random.rand(50000).astype(numpy.float32)
b = numpy.random.rand(50000).astype(numpy.float32)
ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)
a_dev = cl_array.to_device(queue, a)
b_dev = cl_array.to_device(queue, b)
dest_dev = cl_array.empty_like(a_dev)
prg = cl.Program(ctx, """
__kernel void sum(__global const float *a,
__global const float *b, __global float *c)
{
int gid = get_global_id(0);
c[gid] = a[gid] + b[gid];
}
""").build()
prg.sum(queue, a.shape, None, a_dev.data, b_dev.data, dest_dev.data)
print(la.norm((dest_dev - (a_dev+b_dev)).get()))