Когда вы ставите в очередь ядро со многими рабочими элементами, оно делится на рабочие группы и потоки, которые заставляют GPU заняты. Действительно большие глобальные размеры запускают столько потоков, сколько могут, и выпускают новые, когда старые заканчиваются. Таким образом, вы можете найти наименьший глобальный размер, который все еще хорошо работает, и ставить в очередь многие из них (вместо одного большого), но также проверять результаты предыдущих, которые вы поставили в очередь (использовать события, чтобы знать, когда они сделаны, и читайте назад память, чтобы получить их результаты). Когда вы получите правильный ответ, остановите ядра очереди.
так вместо этого:
queue entire job (say, 4096 x 4906)
сделать:
do
{
queue some work (say, 32 x 32)
check if any of the prior work queued is done and check if it got the answer
}
while (no more work OR answer found)
Вам нужно выяснить правильный компромисс между размером небольших рабочих мест и накладными расходами на проверку их результатов в сравнении дополнительная работа сделана.
Я думаю, что что-то не так в том, что вы называете «ядром». Вы хотите, чтобы остановить текущее ядро, когда у workitem есть результат? – DarkZeros