LINUX.ORG.RU

POCL работает в один поток

 ,


0

2

Добрый день!

Пишу одну считалку, использую OpenCL для вычислений. И пока что тестирую на pocl. И вот почему-то pocl нагружает только одно ядро процессора, т.е. считает в один поток. Хотя вроде как по-умолчанию должен по количеству ядер потоки делать.

Ядро:

kernel void kernel_geodesic(int num, global double *pos, global double *dir, global int *finished, double h, global const double *args)
{
    int id = get_global_id(0);
    int i;

    struct tensor_1 cpos = {
        .covar = {false},
    };
    struct tensor_1 cdir = {
        .covar = {false},
    };
    
    if (finished[id] == 1)
        return;

    for (i = 0; i < DIM; i++)
    {
        cpos.x[i] = pos[DIM*id + i];
        cdir.x[i] = dir[DIM*id + i];
    }

	for (i = 0; i < num; i++)
    {
        if (!allowed_area(&cpos, args))
        {
            finished[id] = 1;
            break;
        }

    	if (!geodesic_calculation_step(&cpos, &cdir, h, args))
        {
            finished[id] = 1;
            break;
        }
    }

    for (i = 0; i < DIM; i++)
    {
        pos[DIM*id + i] = cpos.x[i];
        dir[DIM*id + i] = cdir.x[i];
    }
}

При запуске с 1000 объектами получаю

global work size: 1000
local work size: 4096
★★★★★

Обычно local size меньше чем global size и лучше если бы local size был выставлен явно в ядре аттрибутом __attribute__((reqd_work_group_size(WG, 1, 1))), а global size на него делился.

PoCL должен выделять несколько потоков (в зависимости от количества ядер CPU) на выполнение work group’ы. Тут потоков запускается 1000 из 4096. Если, например, аппаратных потоков 4 то он так и будет работать - по 4 потока на WG, т.е. по одному потоку на каждые 1024 work item’а. Хотите запустить только 1000 - получите один поток.

Это всё только гипотеза, можно проверить выставив переменную среды POCL_MAX_PTHREAD_COUNT в какое-нибудь большое значение и посмотрев, изменится ли поведение.

tim239 ★★
()
Ответ на: комментарий от tim239

local size меньше чем global size

о, спасибо большое!

заработало правильно.

Видимо я неправильно понимал смысл local

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от tim239

Тут еще один неприятный момент всплыл. Если global size не делится нацело на local size, то pocl глючит и не считает вообще

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

И не должен:

If local_work_size is specified, the values specified in global_work_size[0], … global_work_size[work_dim - 1] must be evenly divisible by the corresponding values specified in local_work_size[0], … local_work_size[work_dim – 1].

Это из спецификации OpenCL 1.2, если что.

Zeta_Gundam
()
Последнее исправление: Zeta_Gundam (всего исправлений: 1)
Ответ на: комментарий от cvs-255

Как уже выше написали, global size должен делиться на local size. Всё зависит от того, как запускать ядро - можно в конце концов вообще не указывать local size, если пока не нужна производительность.

local_work_size can also be a NULL value in which case the OpenCL implementation will determine how to be break the global work-items into appropriate work-group instances.

tim239 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.