Ааааа ... Я знаю проблему. Я сам играл с ним, когда писал статью.
Нет явного способа сделать это, однако вы можете попробовать «взломать» его, если некоторые блоки ничего не делают.
- если вы никогда не запускаете больше блоков, поскольку есть мультипроцессоры, тогда ваша работа проста - просто запустите еще меньше блоков. Некоторые из SM гарантированно не будут работать, потому что блок не может быть разделен на несколько SM.
- если вы запускаете гораздо больше блоков и просто полагаетесь на драйвер для их планирования, используйте другой подход: просто запустите столько блоков, сколько может обработать ваш графический процессор, и если один из блоков завершит свою работу, вместо его завершения, вернитесь назад к началу и выберите другой фрагмент данных для работы. Скорее всего, производительность вашей программы не упадет; может быть даже лучше, если вы тщательно спланируете свою работу :)
- Самая большая проблема - это когда все ваши блоки работают на GPU одновременно, но у вас более одного блока на SM. Затем вам нужно запустить нормально, но вручную «отключить» некоторые блоки и приказать другим блокам выполнить работу за них. Проблема в том, какие блоки отключить, чтобы гарантировать, что один SM работает, а другой - нет.
Из моих собственных экспериментов устройства 1.3 (у меня был GTX 285) планируют блоки в последовательности. Таким образом, если я запускаю 60 блоков на 30 SM, блоки 1-30 планируются на SM 1-30, а затем 31-60 снова на SM от 1 до 30. Таким образом, отключая блоки 5 и 35, SM номер 5 практически не делать что-либо.
Заметьте, однако, что это мое личное экспериментальное наблюдение, которое я сделал 2 года назад. NVIDIA никоим образом не подтверждает, не поддерживает, не поддерживает и может измениться (или уже изменилась) с новыми графическими процессорами и / или драйверами.
Я бы предложил - попробуйте поиграть с некоторыми простыми ядрами, которые выполняют большую часть глупой работы, и посмотрите, сколько времени потребуется для вычислений в различных конфигурациях «включено» / «отключено». Если вам повезет, вы поймаете падение производительности, означающее, что 2 блока фактически выполняются одним SM.