Как обрабатываются вложенные ветви в архитектуре Pascal? - PullRequest
0 голосов
/ 16 ноября 2018

При чтении руководства по программированию CUDA:

https://docs.nvidia.com/cuda/cuda-c-programming-guide/#simt-architecture

Я наткнулся на следующий абзац:

До Вольты деформации использовали один программный счетчик, общий для всех 32 потоков в деформации вместе с активной маской, указывающей активные нити деформации. В результате потоки из одной и той же деформации в разных областях или разных состояниях выполнения не могут сигнализировать друг другу или обмениваться данными, а алгоритмы, требующие детального обмена данными, защищенными блокировками или мьютексами, могут легко привести к взаимоблокировке, в зависимости от того, какая деформация конкурирующие темы происходят из.

Однако в начале того же раздела написано:

Отдельные потоки, составляющие деформацию, начинаются вместе по одному и тому же адресу программы, но у них есть собственный счетчик адресов команд и состояние регистрации, и поэтому они могут свободно ветвиться и выполняться независимо.

Что противоречит другому абзацу, поскольку в нем упоминается, что потоки имеют свой собственный программный счетчик, а в первом абзаце их нет.

Как обрабатывается эта активная маска, когда программа имеет вложенные ветви (например, операторы if)?

Как поток узнает, когда выполняется расходящаяся часть, которую ему не нужно было выполнять, если он предположительно не имеет собственного программного счетчика?

1 Ответ

0 голосов
/ 16 ноября 2018

Этот ответ весьма спекулятивен, но, основываясь на доступной информации и некотором образованном предположении, я полагаю, что до Вольты он работал так, что каждая деформация в основном имела бы стек «адресов возврата», а также активную маску. или, возможно, на самом деле инверсия активной маски, т. е. маски для запуска другой части ветви после того, как вы вернетесь. При таком дизайне каждая деформация может иметь только одну активную ветвь в любой момент времени. Следствием этого является то, что планировщик варпа может планировать только одну активную ветвь варпа. Это делает невозможным справедливое планирование, не связанное с голодом, и порождает все ограничения, которые раньше были, например, в отношении блокировок.

Я считаю, что они в основном сделали с Volta то, что теперь есть отдельный такой стек и программный счетчик для каждой ветви (или, может быть, даже для каждого потока; функционально должно быть неразличимо, имеет ли каждый поток свой собственный физический программный счетчик или для каждой ветви имеется один общий счетчик программ; если вы действительно хотите узнать об этой детали реализации, возможно, вы могли бы спроектировать какой-нибудь эксперимент, основанный на проверке того, в какой момент у вас заканчивается свободное пространство в стеке). Это изменение дает всем текущим ветвям явное представление и позволяет планировщику деформации в любой момент выбрать потоки из любой ветки для запуска. В результате планирование варпа может быть сделано без голодания, что избавляет от многих ограничений, которые были у более ранних архитектур…

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...