Как правило, вы хотите, чтобы ваши блоки / сетка соответствовали вашим данным и одновременно максимизировали занятость, то есть, сколько потоков активно одновременно.Основными факторами, влияющими на занятость, являются использование общей памяти, использование регистров и размер блока потоков.
Возможности обработки в графическом процессоре с поддержкой CUDA разделены на SM (потоковые мультипроцессоры), а количество SM зависит от фактическогокарты, но здесь мы сосредоточимся на одном SM для простоты (все они ведут себя одинаково).Каждый SM имеет конечное количество 32-битных регистров, разделяемую память, максимальное количество активных блоков и максимальное количество активных потоков.Эти числа зависят от CC (вычислительные возможности) вашего GPU и могут быть найдены в середине статьи в Википедии http://en.wikipedia.org/wiki/CUDA.
Прежде всего, размер блока вашего потока всегда должен быть кратным 32, потому чтоядра выдают инструкции в деформациях (32 потока).Например, если у вас размер блока 50 потоков, графический процессор по-прежнему будет выдавать команды для 64 потоков, и вы просто их теряете.
Во-вторых, прежде чем беспокоиться о совместной памяти и регистрах, попробуйте изменить размерваши блоки основаны на максимальном количестве потоков и блоков, которые соответствуют вычислительным возможностям вашей карты.Иногда есть несколько способов сделать это ... например, карта CC 3.0 каждый SM может иметь 16 активных блоков и 2048 активных потоков.Это означает, что если у вас 128 потоков на блок, вы можете разместить в своем SM 16 блоков, прежде чем достигнете ограничения в 2048 потоков.Если вы используете 256 потоков, вы можете уместить только 8, но вы все еще используете все доступные потоки и по-прежнему будете полностью заняты.Однако при использовании 64 потоков на блок будет использоваться только 1024 потока при достижении ограничения в 16 блоков, то есть только 50% занятости.Если использование общей памяти и регистров не является узким местом, это должно быть вашей главной задачей (кроме измерений ваших данных).
По теме вашей сетки ... блоки в вашей сетке для начала распределены по SM, а затем оставшиеся блоки помещаются в конвейер.Блоки перемещаются в SM для обработки, как только в этом SM появляется достаточно ресурсов для захвата блока.Другими словами, когда блоки завершаются в SM, новые перемещаются внутрь. Можно привести аргумент, что меньшие блоки (128 вместо 256 в предыдущем примере) могут завершаться быстрее, поскольку особенно медленный блок потребляет меньше ресурсов, ноэто очень сильно зависит от кода.
Что касается регистров и общей памяти, посмотрите на это далее, так как это может ограничивать вашу занятость.Общая память является конечной для всего SM, поэтому старайтесь использовать ее в количестве, которое позволяет как можно большему количеству блоков уместиться на SM.То же самое касается использования регистра.Опять же, эти числа зависят от вычислительных возможностей и могут быть найдены в виде таблицы на странице википедии.Удачи!