Подтвердить что ты не робот

Какая разница между "-arch sm_13" и "-arch sm_20"

Мне нужно вычисление двойной точности в моем приложении. Согласно тому, что я нашел в google, я должен добавить флаг "-arch sm_13" или "-arch sm_20" .

Q1: В чем разница между "-arch sm_13" и "-arch sm_20" ?

Q2: Есть ли разница в производительности между "-arch sm_13" и "-arch sm_20" ?

Мой графический процессор: GTX 570.

Спасибо.

4b9b3361

Ответ 1

SM означает потоковый мультипроцессор, а число указывает на функции, поддерживаемые архитектурой. Вы можете найти хорошее описание в CUDA Programming Guide в разделах 3.1.2-3.1.4, и вы можете увидеть функции, связанные с каждой архитектурой в таблице в приложении F.

Из руководства NVCC (также входит в набор инструментов):

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

У вашего GPU есть Compute Capability 2.0, поэтому вы должны использовать sm_20, чтобы позволить компилятору использовать функции, недоступные в старых архитектурах. Если вы хотите иметь обратную совместимость, вы также можете настроить таргетинг на sm_13 (или sm_1x), проверьте вышеприведенные документы о том, как использовать параметр -gencode для nvcc для задания нескольких архитектур в одном вызове nvcc.

Что касается производительности, то одна вещь, которую нужно обратить внимание, заключается в том, что sm_1x не поддерживает плавающую точку IEEE754, поэтому, если вы нацеливаете sm_13 и запускаете на устройстве с Compute Capability 2.0 или более поздней версией, вы можете обнаружить, что плавающая точка работает быстрее, поскольку она используя менее точный путь. Вы также можете настроить менее точный путь с помощью sm_20 или более поздних версий с помощью опций -ftz=true -prec-div=false -prec-sqrt=false, см. Раздел 5.4.1 в Руководстве по программированию CUDA для получения дополнительной информации об этом.