Ответ 1
Две лучшие ссылки:
Я постараюсь ответить на каждый из ваших вопросов.
Программист делит работу на потоки, потоки на блоки потоков и блоки потоков на сетки. Распределитель вычислений распределяет блоки потоков потоковым мультипроцессорам (SMs). Когда блок потока распределяется на SM, выделяются ресурсы для блока потока (перекосы и разделяемая память), а потоки делятся на группы из 32 нитей, называемых искажениями. После выделения основы он называется активной деформацией. Два планировщика деформации выбирают два активных перекоса за цикл и отправляют основы на исполнительные блоки. Подробнее о исполнительных устройствах и диспетчеризации см. 1 p.7-10 и 2.
4. Существует сопоставление между laneid (индекс нитей в основе) и ядром.
5. Если варп содержит менее 32 потоков, он будет в большинстве случаев выполняться так же, как если бы он имел 32 потока. У Warps может быть меньше 32 активных потоков по нескольким причинам: количество потоков на блок не делится на 32, программа выполняет расходящийся блок, поэтому потоки, которые не занимают текущий путь, помечены как неактивные или поток из warp завершен.
6. Блок потока будет разделен на WarpsPerBlock = (ThreadsPerBlock + WarpSize - 1)/WarpSize Для планировщиков warp нет необходимости выбирать два искажения из одного и того же блока потоков.
7. Блок выполнения не останавливается при работе с памятью. Если ресурс недоступен, когда команда готова к отправке, инструкция будет отправлена снова в будущем, когда ресурс будет доступен. Деформации могут останавливаться на барьерах, операциях с памятью, работе с текстурой, зависимостях данных... Замедленная деформация не может быть выбрана планировщиком варпа. На Ферми полезно иметь по меньшей мере 2 подходящих искажения за такт, чтобы планировщик warp мог выдать инструкцию.
См. ссылку 2 для различий между GTX480 и GTX560.
Если вы прочитаете справочный материал (несколько минут), я думаю, вы обнаружите, что ваша цель не имеет смысла. Я постараюсь ответить на ваши вопросы.
1. Если вы запустили ядро < < 8, 48 → > , вы получите 8 блоков с двумя перекосами из 32 и 16 потоков. Нет гарантии, что эти 8 блоков будут назначены различным SM. Если для SM назначены 2 блока, то возможно, что каждый планировщик деформаций может выбрать деформацию и выполнить деформацию. Вы будете использовать только 32 из 48 ядер.
2. Существует большая разница между 8 блоками из 48 потоков и 64 блоками из 6 потоков. Предположим, что ваше ядро не имеет расхождения, и каждый поток выполняет 10 команд.
- 8 блоков с 48 потоками = 16 бит * 10 инструкций = 160 инструкций
- 64 блока с 6 потоками = 64 перекоса * 10 инструкций = 640 инструкций
Для обеспечения оптимальной эффективности разделение работы должно быть кратным 32 нитям. Аппаратное обеспечение не будет сливать потоки из разных перекосов.
3. GTX560 может иметь 8 SM * 8 блоков = 64 блока за раз или 8 SM * 48 warps = 512 бит, если ядро не максимизирует регистры или разделяемую память. В любой момент времени часть работы будет активна на SM. Каждый SM имеет несколько исполнительных блоков (больше, чем CUDA). Какие ресурсы используются в любой момент времени, зависит от планировщиков warp и комбинации команд приложения. Если вы не выполняете операции TEX, то единицы TEX будут простаивать. Если вы не выполняете особую операцию с плавающей запятой, блоки SUFU будут работать.
4. Параллельный Nsight и Visual Profiler показывают
а. выполненный IPC
б. выпущен IPC
с. активные перекосы за активный цикл
д. допустимые перекосы за активный цикл (только Nsight)
е. warp stall причинам (только Nsight)
ф. активных потоков на каждую выполненную инструкцию
Профилировщик не показывает процент использования любого из исполнительных блоков. Для GTX560 приблизительная оценка будет IssuedIPC/MaxIPC. Для MaxIPC GF100 (GTX480) - 2 GF10x (GTX560) - 4, но цель - 3 - лучшая цель.