iCrosss Facebook page

четверг, 4 марта 2010 г.

Подводные камни “–deviceemu”

При разработке приложений с использованием технологии CUDA остро стоит вопрос об отладке функций, которые выполняются на графическом процессоре. Код написанный с директивами __global__, __device__, а также все переменные и массивы которые инициализированы для хранения в памяти графического адаптера не могут быть доступны к просмотру и отладке при помощи стандартных средств разработки (например, Visual Studio). Также все указатели на на выделенную видео память не являются валидными в контексте CPU и RAM.
Для решения этой проблемы был разработан подход, который позволил производить отладку приложений подобного рода. Его суть состоит в том, чтоб эмулировать весь код, который предназначен для выполнения на GPU, при помощи процессора. В таком случае все потоки, которые должны выполнятся на GPU, создаются как потоки операционной системы. Вся память, которая выделяется на адаптере, теперь принадлежит процессу.
Все это можно активировать, добавив опцию компилятора NVCC «-deviceemu» в список опций компиляции .cu файла. После этого весь код проекта будет доступен для отладки, так как фактически он выполняется центральным процессором.
Но не всё так чудесно. С возможностью отлаживать ваши программы, вы приобрели вероятность наступить на грабли, которые разбросало данное решение.
Ниже я приведу основные проблемы, которые могут возникнуть при использовании режима эмуляции:
  • При использовании режима эмуляции существует возможность вызова функций внешних библиотек из ядра или локальных функций не являющихся __device__ функциями
  • В режиме эмуляции можно получить доступ к данным находящимся в ОЗУ системы из функций графического адаптера и наоборот. Это является одной из основных проблем так как при выполнении на GPU функции не смогут получть доступ к памяти по темже указателям, что приведёт к ошибкам и разнице в результатах расчётов.
  • В режиме эмуляции отсутствуют ограничения на размер разделяемой памяти (__shared__)
  • Некоторые 32 разрядные операционные системы Windows (речь не идёт о серверных ОС), такие как Windows XP имеют ограничение на максимальное выделение памяти в размере 2 Гб в рамках одного процесса. А на графских адаптерах NVIDIA Tesla установлено 4 Гб
  • Результаты вычислений могут не совпадать в режиме эмуляции и в режиме выполнения на устройстве. Это можно объяснить очень просто. При работе сопроцессора используются 80 битные регистры при операциях с плавающей точкой, а результат округляется до соответствующего типа (32 бита float или 64 – double). Графические адаптеры не имеют такой возможности и оперируют только предоставленным количеством разрядов. Соответственно при большом количестве вычислений может накопиться некоторая небольшая погрешность, что и даст разницу результатов. Исправив слово состояние сопроцессора при помощи команд ассемблера можно добиться одинаковых результатов, за счёт уменьшения точности расчетов на CPU. Более детальную информацию можно посмотреть здесь, тамже можно найти исходные коды для изменения слова состояния сопорцессора
  • Время работы приложения в режиме эмуляции в десятки раз может превышать время работы того же алгоритма на центральном процессоре без разпаралеливания. Это существенный недостаток, иногда необходимо добраться до определённого потока и приходиться ждать минуты, что очень затрудняет отладку
  • Также немаловажным недостатком является невозможность использования режима эмуляци при программировани CUDA на уровне Driver API. Это можно объяснить тем, что режим эмуляции поддерживается только на уровне CUDA Runtime. При компиляции в режиме эмуляции, NVCC не генерирует файлы необходимые для загрузки модуля, которые могут содержать только GPU код (.cubin).
Также нельзя использовать режим эмуляции частично, т.е. компилировать некоторые файлы проекта в родном режиме, а некоторые в режиме эмуляции это грозит ошибкой cudaErrorMixedDeviceExecution.
Всё это может привести к ошибкам исправлять которые достаточно сложная задача, что делает режим эмуляции не достаточно гибким при отладке. Работая в этом режиме необходимо быть внимательным ко всем деталям. Но, несмотря на это, некоторые из приведенных ограничений, могут стать даже полезными, и в умелых руках сослужить хорошую службу разработчику.
Сейчас компания NVIDIA ведет работу над разработкой продукта под названием Nexus, который позволит разработчику отлаживаться непосредственно на графическом процессоре. Но об этом в другой статье :)

Комментариев нет:

Отправить комментарий