Я пытаюсь понять архитектуру устройств OpenCL, таких как графические процессоры, и не могу понять, почему существует явное ограничение на количество рабочих элементов в локальной рабочей группе, то есть константу CL_DEVICE_MAX_WORK_GROUP_SIZE.
Мне кажется, что об этом должен позаботиться компилятор, т. Е. Если (одномерное для простоты) ядро выполняется с размером локальной рабочей группы 500, а его физический максимум равен 100, и ядро выглядит, например, так:
__kernel void test(float* input) {
i = get_global_id(0);
someCode(i);
barrier();
moreCode(i);
barrier();
finalCode(i);
}
тогда его можно автоматически преобразовать в выполнение с размером рабочей группы 100 в этом ядре:
__kernel void test(float* input) {
i = get_global_id(0);
someCode(5*i);
someCode(5*i+1);
someCode(5*i+2);
someCode(5*i+3);
someCode(5*i+4);
barrier();
moreCode(5*i);
moreCode(5*i+1);
moreCode(5*i+2);
moreCode(5*i+3);
moreCode(5*i+4);
barrier();
finalCode(5*i);
finalCode(5*i+1);
finalCode(5*i+2);
finalCode(5*i+3);
finalCode(5*i+4);
}
Однако, по-видимому, по умолчанию это не делается.Почему бы и нет?Есть ли способ сделать этот процесс автоматизированным (кроме написания для него прекомпилятора)?Или есть внутренняя проблема, которая может привести к сбою моего метода на некоторых примерах (и можете ли вы дать мне один)?