Рассказы о математике с примерами на языках Python и C | страница 32



"{ \n" \

" unsigned int i = get_global_id(0); \n" \

" //printf(\"Task-%d\\n\", i); \n" \

" output[i] = 0; \n" \

" unsigned int val = input[i]; \n" \

" for(unsigned int p=2; p<=val/2; p++) { \n" \

" if (val % p == 0) \n" \

" return; \n" \

" } \n" \

" output[i] = 1; \n" \

"} \n" \

"\n";


Суть кода проста. Массив input хранит числа, которые нужно проверить, функция get_global_id возвращает индекс задачи, которую выполняет данное ядро. Мы берем число с нужным индексом, проверяем его на простоту, и записываем 0 или 1 в зависимости от результата, в массив output.


Инициализировать подготовку вычислений:

int gpu = 1;

clGetDeviceIDs(NULL, gpu ? CL_DEVICE_TYPE_GPU : CL_DEVICE_TYPE_CPU, 1, &device_id, NULL);

      cl_context context = clCreateContext(0, 1, &device_id, NULL, NULL, &err);

      cl_command_queue commands = clCreateCommandQueue(context, device_id, 0, &err);


На этом этапе можно выбрать где будут производиться вычисления, на основном процессоре или на GPU. Для отладки удобнее основной процессор, окончательные расчеты быстрее на GPU.


Подготовить данные

#define DATA_SIZE 1024

      cl_uint *data = (cl_uint*)malloc(sizeof(cl_uint) * DATA_SIZE);

      cl_uint *results = (cl_uint*)malloc(sizeof(cl_uint) * DATA_SIZE);


Загрузить данные и программу из основной памяти в GPU

      cl_program program = clCreateProgramWithSource(context, 1, (const char **) & KernelSource, NULL, &err);

      clBuildProgram(program, 0, NULL, NULL, NULL, NULL);

      cl_kernel kernel = clCreateKernel(program, "primes", &err);

      cl_mem output = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(cl_uint) * count, NULL, NULL);


      clEnqueueWriteBuffer(commands, input, CL_TRUE, 0, sizeof(cl_uint) * count, data, 0, NULL, NULL);

      clSetKernelArg(kernel, 0, sizeof(cl_mem), &output);


      clGetKernelWorkGroupInfo(kernel, device_id, CL_KERNEL_WORK_GROUP_SIZE, sizeof(local), &local, NULL);


Запустить вычисления на GPU и дождаться их завершения