Комментировать

Возможно, я не все ваши

Возможно, я не все ваши вопросы понял правильно, если что не так - давайте уточнять.

0) Да, у вас есть множество копий, собранных в блоки (у блока - общая память). Количество потоков в блоке и самих блоков вы задаете на старте. При этом данные должны быть скопированы на GPU до старта kernel.

1) Блоки не могут иметь разный размер.

2) Остановить работу всех потоков из какого-то - можно через внешнюю синхронизацию (если нужно остановить, какой-то поток делает atomicAdd, все потоки проверяют значение этой переменной в глобальной памяти регулярно), но атомарные операции - довольно медленные. Остановить потоки блока - да, можно через shared memory, но остальные блоки об этом не узнают.

3) Да, грубо говоря ставятся в очередь. Количество одновременно исполняемых блоков на одном SP ограничено количеством регистров, потоков и shared memory (планировщик запустит столько блоков, чтобы им всего хватило), дальше умножаем на число SP, все что с первого раза не влезло - в очередь.