Я прочитал от kepler whitepaper hereКэплер блоков на мп?
, что kepler поддерживает до 16 блоков/mp.
Но потоки/блоки = 1024 и потоки/mp = 2048, следовательно, блоки/mp = 2.
Я что-то упустил?
Я прочитал от kepler whitepaper hereКэплер блоков на мп?
, что kepler поддерживает до 16 блоков/mp.
Но потоки/блоки = 1024 и потоки/mp = 2048, следовательно, блоки/mp = 2.
Я что-то упустил?
Как вы сказали, правильно для кеплеров может работать потоковый мультипроцессор до 16 threadblocks.
В вашем примере, если блок потока состоит из 1024 потоков, то только одно из двух блоков может запускаться одновременно с одним mp, поскольку в этом случае вы будете ограничены максимальным количеством потоков на мультипроцессор - 2048/1024 = 2 блоки.
Существует несколько факторов, которые влияют на то, сколько блоков может выполняться одновременно в поточном мультипроцессоре. SM также имеет ограниченное количество регистров и разделяемую память. Если вы используете слишком много регистров или слишком много разделяемой памяти, вы будете ограничены этими факторами.
Хороший обзор для этого - CUDA occupancy calculator. С листом excel вы можете легко настроить конфигурацию ядра для всех архитектур CUDA, и вы увидите, чем ядро будет ограничено.
Также CUDA programming guide предоставляет всю необходимую информацию.
Может быть, простой пример может помочь - сделать с заселению калькулятором для вычислений возможности 3.0:
Если ваш блок нити состоит из 512 нитей, и вы не будете использовать любые регистры или разделяемую память, чем сумма на параллельные блоки влияет только размер блока. Для cc 3.0 для SM 2048 потоков можно запустить. Итак, 2048/512 = 4. Можно использовать только 4 потока блоков одновременно.
На втором этапе вы будете использовать дополнительные 48 регистров на поток. В блоке потока 512 * 48 = 24576 будут использоваться регистры. Но SM может использовать только 65536 регистров. Теперь можно запустить только два блока вместо четырех.
На последнем шаге предположим, что в блоке используется 32000 байт общей памяти. Поскольку SM может использовать только 49152 байта для общей памяти, возможно только использовать 1 блок потока.
: Вы имеете в виду, что потоки/mp могут быть, например, 128, поэтому 1024/128 = 8 блоков/mp. Но как я могу найти, сколько потоков/тп? – George
Вы можете найти всю эту информацию в калькуляторе занятости на вкладке «Данные GPU» или заполнить информацию на вкладке «Калькулятор» (2. Введите использование ресурсов). Чем вы увидите ниже 3.) все результаты. Другим источником является [руководство по программированию CUDA] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/#compute-capabilities), где вы можете найти эту информацию в разделе «вычислительные возможности». – hubs
: Хорошо, спасибо, так что это был просто «до», который был уловкой. – George