Pull to refresh

Обзор CUDA отладчика «NVIDIA Parallel Nsight 2.0»

Reading time 6 min
Views 17K
imageОтладка параллельного кода – процесс утомительный и умозатратный. Ошибки распараллеливания проблематично отловить из-за недетерминированности поведения параллельных приложений. Более того, если ошибка обнаружена, ее часто сложно воспроизвести снова. Бывает, что после изменения кода, сложно удостовериться, что ошибка устранена, а не замаскирована. Чаще всего, ошибки в параллельной программе являются гейзенбагами. Порой испытываешь острую потребность в максимально удобных и функциональных инструментах отладки параллельных программ.
Итак, чуть больше года назад компания NVIDIA выпустила пакет инструментов, интегрируемых в Microsoft Visual Studio 2008 sp1 и 2010 для отладки параллельных программ, написанных на CUDA под названием NVIDIA Parallel Nsight. Об этом, в свое время, писал XaocCPS на хабросообществе. С тех пор этот продукт стал более совершенным и абсолютно бесплатным. На сегодняшний день последняя версия 2.0. Рассмотрим возможные конфигурации, установку, настройку, а так же основные возможностям NVIDIA Parallel Nsight.

Возможные конфигурации


NVIDIA предлагает 4 варианта конфигурации оборудования для установки Parallel Nsight, отличающихся возможностью использования тех или иных инструментов:
Конфигурация Система с 1 GPU Система с 2 GPU Две системы, каждая с GPU Система с 2 GPU на одной машине (NVIDIA Multi-OS)
CUDA C/C++ Параллельный отладчик 0 1 1 1
Direct3D отладчик шейдеров 0 0 1 1
Direct3D графический инспектор 1 1 1 1
Анализатор 1 1 1 1

NVIDIA называет “ULTIMATE” конфигурацией 4 вариант. NVIDIA Multi-OS представляет собой виртуальную машину, с поддержкой девелопер видеодрайвера. Подумывал поднять подобную систему с помощью VMWare, но столкнулся как раз с невозможностью установки девелопер драйвера на видеоадаптер виртуальной системы.
NVIDIA предлагает следующие требование к системе, в зависимости от выбранной конфигурации:

Аппаратные требования:

Минимальные Рекомендуемые
Операционная система Windows® Vista SP3, Windows 7 or Windows HPC Server 2008 (32- или 64-bit) Такие же
CPU Intel Pentium Dual-core CPU эквивалентный @ 1.6 GHz Intel Pentium Dual-core CPU эквивалентный @ 2.2 GHz или выше
RAM Для хоста: 2 GB Для машины, выполняющей паравычисления: 2 GB Для хоста: 2 GB или больше Для машины, выполняющей паравычисления: 4 GB или больше
Свободное место на винчестере 32-bit машина: 240 MB для Parallel Nsight 64-bit машина: 330 MB для Parallel Nsight 32-bit машина с Parallel Nsight хост часть: 240 MB + место под ваш проект.
64-bit машина с Parallel Nsight хост часть: 330 MB + место под ваш проект.(Если вы используете удаленную машину, для запуска/отладки приложения, то на удаленной машине должно быть 240 мб свободного места + место под отладочную версию вашего приложения)
Устройства вывода Отдельный монитор для вычислительного GPU Рекомендуется использовать DVI соединение
Локальная отладка (хост и вычислитель на одной машине ) Два GPU, поддерживающих CUDA. (см. список поддерживаемых устройств) Такие же
Удаленная отладка (хост и вычислитель на разных машинах) На вычислительной машине: 1 GPU с поддержкой CUDA. На хосте (там где установлена студия): 1 GPU on host machine: can be any GPU. Такие же
Поддерживаемые GPU developer.nvidia.com/parallel-nsight-supported-gpus developer.nvidia.com/parallel-nsight-supported-gpus

Программные требования:

Драйвер дисплея Необходимо установить любой NVIDIA драйвер дисплея, который поддерживает Parallel Nsight. Если у вас есть NVIDIA видеокарта, установленная на вычислительной машине, то на ней, вероятно, уже установлен этот драйвер. Тем не менее, NVIDIA Parallel Nsight требует обновленную версию драйвера для того, чтобы нормально функционировать. Такие же
Локальная отладка (хост и вычислитель работают на одной машине) .NET Framework 3.5 с SP1Visual Studio: Microsoft Visual Studio 2008 с SP1 Standard Edition или вышеили Microsoft Visual Studio 2010 Такие же
Удаленная отладка (хост и вычислитель работают на разных машинах) Хост-машина:.NET Framework 3.5 with SP1Visual Studio:Microsoft Visual Studio 2008 with SP1 Standard Edition или вышеили Microsoft Visual Studio 2010Вычислительная машина:.NET Framework 3.5 with SP1 Такие же
Сеть Интернет соединение для скачивания инсталлятора.Для удаленной отладки: TCP/IP соединение хоста и выч. машины. Такие же

Установка Parallel Nsight


Для возможности отладки параллельного кода достаточно конфигурации с двумя CUDA совместимыми GPU на одной машине (конечно, было бы гораздо интереснее рассказать о конфигурации с двумя машинами, но у меня, к сожалению, на данный момент нет возможности собрать такую конфигурацию).
Итак, мне пришлось докупить одну из самых бюджетных CUDA поддерживающих карточек: GeForce 210, в дополнение к моей рабочей карточке: GeForce GTX460. Таким образом, для установки Parallel Nsight был подготовлена следующая аппаратная конфигурация:

Хост:

Тип ЦП QuadCore AMD Phenom II X4 965, 3918 MHz
Системная плата Gigabyte GA-790FXTA-UD5 (3 PCI, 1 PCI-E x1, 3 PCI-E x16, 4 DDR3 DIMM, Audio, Dual Gigabit LAN, IEEE-1394)
Чипсет системной платы AMD 790FX, AMD K10
Системная память 4096 Мб
Вывод:

Видеоадаптер NVIDIA GeForce 210 (512 Мб)
Видеоадаптер NVIDIA GeForce GTX 460 (1024 Мб)
Монитор ENV LED2770h [NoDB] (AUBB1JA005271) (DVI)

В качестве операционной системы я использовал Windows 7 enterprise edition x64. Далее нам понадобится MVS не ниже 2008 sp1.

На сайте NVIDIA находятся нужные дистрибутивы. Нам понадобятся:
  • Developer Drivers for WinVista and Win7
  • CUDA Toolkit
  • CUDA Computing SDK
  • Parallel Nsight 2.0.

Устанавливаем дистрибутивы в том же порядке. Теперь в студии при вызове мастера новых проектов должен добавиться новый раздел «NVIDIА»(шаблон идет в пакете «CUDA Toolkit»), а в нем тип проекта «NVIDIA CUDA 4.0».Выбираем его и создаем проект. Если установка всех дистрибутивов прошла корректно, то полученный хеловорлд можно скомпилировать и запустить.
Все ок? Тогда займемся непосредственно отладчиком Parallel Nsight. Так как наша машина является сразу и сервером и вычислителем, то необходимо сперва запустить хостовый компонент: «Nsight Monitor». Открываем код и ставим точку остановки где-нибудь в процедуре расчетного ядра, запускаем проект специальной кнопокой в панели nsight. Обратите внимание на несколько моментов:
  1. Проект должен быть заранее построен (кнопка запуска приложения nsight не выполняет компиляцию).
  2. Все точки остановки, поставленные за пределами расчетного ядра будут игнорироваться если программа запущена в режиме отладки nsight. Это выполняется и в обратном порядке: если программа отлаживается в обычном режиме, то учитываются только точки остановки напротив обычного кода.
  3. При первом запуске nsight отладчика на семерке вы скорее всего столкнетесь как минимум с двумя проблемами: несовместимость с WPF accelerator, и Windows Aero. Их необходимо выключить (первый выключается добавлением в реестр:
    Windows Registry Editor Version 5.00
    [HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]"DisableHWAcceleration"=dword:00000001

    второй отключается из панели управления) либо можно отключить проверку предупреждений в самом nsight: в студии установить: Nsight->Options->Override local debugging checks в значение “True”, но это чревато проблемами. Например, если в коде указать, в качестве устройства для расчетов, видеокарту, на которой рисуется рабочий стол и запустить nsight отладку, получим вечный фриз. Не ясно, что подразумевается под несовместимостью Parallel Nsight и c WPF/Aero, так как во время отладки с включенной опцией «Override local debugging check» проблем с этими механизмами не наблюдалось как со стороны отладчика, так и самих механизмов.

Итак, отладчик в точке остановки:
image
Теперь, как и при отладке обычного приложения можно посмотреть доступные контрольные значения. Полноценный watcher позволяет просматривать массивы. На скрине выше переменная «A» типа Matrix3:
typedef struct {
int x_size;
int y_size;
int z_size;
float4* elements;
} Matrix3;

Число доступных для просмотра элементов массива “elements” определяется параметром «Max array elements» в настройках отладчика Parallel Nsight.
Как видно из значений индексов: blockIdx и threadIdx: отладчик находится в первой нити первого блока сетки. Возникает вопрос: как переместиться в нужный поток? В инструментах nsight доступно окно: «Nsight Cuda Device Summary», интерфейс, которого позволяет перемещаться между варпами в окрестности потока, на котором была выполнена остановка. Размер окрестности определяется аппаратными возможностями видеочипа. Так при вычислении на GeForce 200 на момент остановки было доступно два блока по 4 варпа:
image
Аналогично для GeForce GTX 460:
image
Доступен 31 блок. Для того чтобы переместиться к конкретной нити внутри варпа, необходимо воспользоваться окном «Cuda Debug Focus» (интерфейс которого также позволяет перемещаться между блоками).
Снова вопрос: «как попасть в поток, который не попадает в окрестность первого потока?». Для этого используются условные точки остановки. Синтаксис условия следующий:
@blockIdx(x,y,z) && @threadIdx(x,y,z)
Отладчик остановится на указанном потоке, относительного которого будет доступна окрестность варпов.
Пакет Nvidia parallel Nsight включает в себя мощный инструментарий для анализа паравычислений на CUDA по всевозможным параметрам с построением графиков и т. д. под названием «Analysis Activity», но это тема отдельной статьи.
Мои впечатления относительно Parralel Nsight только самые приятные. Как мне кажется, большим плюсом является интегрированность в самую популярную среду разработки под windows. Повторюсь, что с недавних пор этот продукт стал абсолютно бесплатным, что очень приятно. Ну и наконец: это единственное средство отладки программ на CUDA под Windows, не считая профайлер «NVIDIA Compute Visual Profiler».
Статья по теме.
И пара тематических роликов с ютуба:

Tags:
Hubs:
+24
Comments 6
Comments Comments 6

Articles