Cuda driver for mac что это

Обновлено: 30.06.2024

CUDA всем хороша, пока под рукой есть видеокарта от Nvidia. Но что делать, когда на любимом ноутбуке нет Nvidia видеокарты? Или нужно вести разработку в виртуальной машине?

Я постараюсь рассмотреть в этой статье такое решение, как фреймворк rCUDA (Remote CUDA), который поможет, когда Nvidia видеокарта есть, но установлена не в той машине, на которой предполагается запуск CUDA приложений. Тем, кому это интересно, добро пожаловать под кат.

rCUDA (Remote CUDA) — фреймворк, реализующий CUDA API, позволяющий использовать удалённую видеокарту. Находится в работоспособной бета-версии, доступен только под Linux. Основная цель rCUDA — полная совместимость с CUDA API, вам не нужно никак модифицировать свой код, достаточно задать специальные переменные среды.

Nvidia прекращает поддержку CUDA на macOS

Производитель графических процессоров NVIDIA отказывается от поддержки CUDA для macOS. Платформа для параллельных вычислений, использующаяся для аппаратного ускорения рендеринга во многих продуктах, "в последний раз" представлена в выпуске CUDA Toolkit 10.2, как сказано в логе изменений.

Новость нельзя назвать большим сюрпризом: Apple не комплектует свои продукты видеокартами NVIDIA последние несколько лет. Для потребительской линейки компания использует интегрированные карты от Intel, а для профессиональных станций, например, Mac Pro, iMac Pro или 16-дюймового MacBook Pro, — карты от AMD.

Однако даже подключить NVIDIA как внешнюю видеокарту (eGPU) стало проблемой, начиная с выхода macOS Mojave (10.14) в прошлом году: для последних карт просто нет драйверов. NVIDIA опубликовали официальное обращение пользователям, где сказали, что ничего с этим не могут сделать:

"Apple полностью контролирует драйверы для Mac OS. К сожалению, на данный момент NVIDIA не может выпустить драйвер без официального разрешения Apple."

Разработчики Apple дали анонимный комментарий изданию Appleinsider, почему купертинская компания приняла такое решение:

"Речь не идет о том, что в Metal 2 нельзя добавить поддержку NVIDIA — у них отличные инженеры, и с производительностью проблем не будет. Просто кто-то наверху этого не хочет."

Драйверы Nvidia для macOS

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

Прежде чем начинать

  • Создайте резервную копию загрузочного тома. Дополнительная информация приведена в разделе Резервное копирование на Mac с помощью Time Machine.
  • Перед загрузкой соответствующего драйвера определите марку и модель ГП NVIDIA.

MacОS 10.14 (Mojave) и более поздние версии в настоящее время не поддерживают CUDA. Не обновляйте до версий, выше macOS 10.13.6, если требуется поддержка CUDA.

Знакомство с программно-аппаратной архитектурой CUDA

Сложность вычислительных заданий требует резкого увеличения ресурсов и скорости компьютеров. Наиболее перспективным направлением повышения скорости решения задач является внедрение идей параллелизма в работу вычислительных систем.

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

Где получить аппаратное ускорение без CUDA?

Большинство коммерческих движков, включая V-Ray GPU, OctaneRender и Redshift, сейчас работают на CUDA. Фреймворк OptiX от NVIDIA, поддержку которого разработчики сейчас активно добавляют в свои продукты (например, последние версии Blender или V-Ray Next), тоже требует CUDA Toolkit.

Другие рендеры, например, Blender Cycles, поддерживают карты AMD с помощью OpenCL, но Apple прекратили поддержку и этого API, заменив OpenCL на собственный Metal 2.


Отношения между Apple и NVIDIA можно официально считать завершёнными

Ограничения

На данный момент поддерживаются только GNU/Linux системы, однако разработчики обещают поддержку Windows в будущем. Текущая версия rCUDA, 18.03beta, совместима с CUDA 5-8, то есть CUDA 9 не поддерживается. Разработчиками заявлена полная совместимость с CUDA API, за исключением графики.

Поговорим о CUDA

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

При использовании данной технологии необходимо знать следующие понятия:

  • устройство (device) – сама видеокарта, графический процессор (GPU) – выполняет команды центрального процессора;
  • хост (host) – центральный процессор (CPU) – запускает различные задания, выделяет память, etc.;
  • ядро (kernel) – функция (задание), которая будет выполняться на GPU.

CUDA позволяет программистам реализовывать на специальном упрощенном диалекте языка C алгоритмы, которые используются в графических процессорах NVIDIA, и включать специальные функции в текст программы на C.

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

Эта технология поддерживает несколько языков программирования. Среди них Java, Python и некоторые другие.

Поддержка CUDA на macOS

NVIDIA прекращает поддержку архитектуры CUDA для macOS, начиная с версии 10.2, которая станет последней совместимой сборкой, говорится на сайте компании. Получается, что все будущие релизы CUDA, которые будут выходить после 10.2, не будут совместимы с операционной системой Apple, по сути, лишая изрядную долю профессиональных пользователей, а также пользователей хакинтошей возможности работать с дискретной графикой NVIDIA. Поэтому единственными ускорителями, которые будут актуальны на маках, отныне будут только решения AMD.

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

Несмотря на то что для многих ни сам термин CUDA, ни его предназначение до сих пор остаются неизвестными, факт того, что NVIDIA отказывается от поддержки macOS, говорит о многом. Скорее всего, это терминальная стадия негативных отношений между двумя компаниями, восстановить которые будет весьма проблематично. Ведь если скандал с участием Qualcomm был довольно скоротечным и, по сути, строился на стремлении одной стороны продемонстрировать свою силу другой, то в случае с NVIDIA дела обстояли несколько иначе.

Этапы запуска программы на GPU или как все происходит

Рассмотрим, как происходит запуск программы на графическом процессоре:

  1. Хост выделяет необходимое количество памяти на устройстве.
  2. Хост копирует данные из своей памяти в память устройства.
  3. Хост запускает ядро на устройстве.
  4. Устройство исполняет это ядро.
  5. Хост копирует результаты из памяти устройства в свою память.

Знакомство с программно-аппаратной архитектурой CUDA

На рисунке изображены все перечисленные шаги запуска программы, кроме первого (источник).

Знакомство с программно-аппаратной архитектурой CUDA

Взаимодействие CPU и GPU

Как видно из рисунка, центральный процессор взаимодействует с графическим через CUDA Runtime API, CUDA Driver API и CUDA Libraries. Runtime и Driver API отличаются уровнем абстракции. Грубо говоря, первый вариант более высокого уровня в плане программирования, более абстрактный, а второй – напротив, более низкого (уровень драйвера).

В целом Runtime API является абстрактной оберткой Driver API. Во время программирования вы можете использовать любой из представленных вариантов. Из личного опыта: при использовании Driver API нужно написать немного «лишнего» кода + данный вариант сложнее.

Также необходимо понять одну важную вещь, которая впоследствии сэкономит вам время и нервы:

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

Давайте разберем написанное подробнее. Чтобы запустить некоторые задачи на GPU, необходимо потратить «немного» времени на выделение памяти, копирование результата, etc., поэтому не нужно выполнять на графическом процессоре легкие задания, которые на деле занимают буквально миллисекунды. Зачем выполнять на GPU то, с чем легко, а главное, быстрее справится центральный процессор?

У вас возникнет вопрос: «Тогда зачем вообще использовать GPU, если при этом приходится тратить драгоценное время на выделение памяти и другие ненужные вещи?». Это заблуждение, и со временем вы поймете, что CUDA – действительно мощная технология. Дальше разберемся, почему это так.

Возможные сценарии использования

  1. Запуск CUDA приложений в виртуальной машине тогда, когда проброс видеокарты неудобен или невозможен, например, когда видеокарта занята хостом, или когда виртуальных машин больше одной.
  2. Ноутбук без дискретной видеокарты.
  3. Желание использовать несколько видеокарт (кластеризация). Теоретически, можно использовать все имеющиеся в команде видеокарты, в том числе совместо.

Аппаратная часть

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

программно-аппаратная архитектура CUDA

Архитектура CPU и GPU

Как видно из картинки – в GPU есть много простых арифметически-логических устройств (АЛП), которые объединены в несколько групп и обладают общей памятью. Это помогает повысить продуктивность в вычислительных заданиях, но немного усложняет программирование.

«Для достижения лучшего ускорения необходимо продумывать стратегии доступа к памяти и учитывать аппаратные особенности.»

GPU ориентирован на выполнение программ с большим объемом данных и расчетов и представляет собой массив потоковых процессоров (Streaming Processor Array), что состоит из кластеров текстурных процессоров (Texture Processor Clusters, TPC). TPC в свою очередь состоит из набора мультипроцессоров (SM – Streaming Multi-processor), в каждом из которых несколько потоковых процессоров (SP – Streaming Processors) или ядер (в современных процессорах количество ядер превышает 1024).

Набор ядер каждого мультипроцессора работает по принципу SIMD (но с некоторым отличием) – реализация, которая позволяет группе процессоров, работающих параллельно, работать с различными данными, но при этом все они в любой момент времени должны выполнять одинаковую команду. Говоря проще, несколько потоков выполняют одно и то же задание.

CUDA

Мультипроцессоры, SM

В результате GPU фактически стал устройством, которое реализует потоковую вычислительную модель (stream computing model): есть потоки входящих и исходящих данных, что состоят из одинаковых элементов, которые могут быть обработаны независимо друг от друга.

Вычислительные возможности

Продолжаем разбираться с CUDA. Каждая видеокарта обладает так называемыми compute capabilities – количественными характеристиками скорости выполнения определенных операций на графическом процессоре. Данное число показывает, насколько быстро видеокарта будет выполнять свою работу.

В NVIDIA эту характеристику обозначают Compute Capability Version. В таблице приведены некоторые видеокарты и соответствующие им вычислительные возможности:

CUDA

Полный перечень можно посмотреть здесь. Compute Capability Version описывает множество параметров, среди которых: количество потоков на блок, максимальное количество блоков и потоков, размер warp, а также многое другое.

Потоки, блоки и сетки

CUDA использует большое количество отдельных потоков для расчетов. Все они группируются в иерархию – grid / block / thread.

Верхний уровень – grid – отвечает ядру и объединяет все потоки, которые выполняет данное ядро. Grid – одномерный или двумерный массив блоков (block). Каждый блок (block) представляет собой полностью независимый набор скоординированных между собой потоков. Потоки из разных блоков не могут взаимодействовать.

Мы упоминали об отличии от SIMD-архитектуры. Есть такое понятие, как warp – группа из 32 потоков (в зависимости от архитектуры GPU, но почти всегда 32). Только потоки в рамках одной группы (warp) могут физически выполняться одновременно. Потоки разных варпов могут находиться на разных стадиях выполнения программы. Такой метод обработки данных обозначается термином SIMT (Single Instruction – Multiple Theads). Управление работой варпов выполняется на аппаратном уровне.

Что такое rCUDA

rCUDA (Remote CUDA) — фреймворк, реализующий CUDA API, позволяющий использовать для CUDA вычислений видеокарту, расположенную на удалённой машине, не внося никаких изменений в ваш код. Разработан в политехническом университете Валенсии (rcuda-team).

Почему графики NVIDIA нет на Mac

Конфликт между Apple и NVIDIA начался ещё десять лет назад, когда Apple лишилась большого количества заказов на MacBook Pro из-за неудачного графического решения. Тогда в Купертино приняли решение, что полагаться на одного поставщика ускорителей, пусть и имеющего отличную репутацию в отрасли, будет нерационально, и обратили внимание на AMD. С тех пор, несмотря на то, что решения последней уступали решениям NVIDIA, отношения между Apple и AMD шли в гору. При этом сама Apple не спешила отказываться от поддержки графики NVIDIA, позволяя владельцам фирменных компьютеров менять один ускоритель на другой по своему желанию.

Почему иногда центральный процессор выполняет задания быстрее графического?

Выше уже было написано, что не стоит выполнять на GPU слишком простые задания. Чтобы понять, следует определить два термина:

  1. Задержка – это преимущественно время ожидания между запросом на какой-либо ресурс и получением доступа к данному ресурсу.
  2. Пропускная способность – количество операций, которые выполняются за единицу времени.

Таким образом, главный вопрос состоит в следующем: почему графический процессор иногда «тупит»? Объясняем на простом примере.

У нас есть 2 автомобиля:

  • легковой фургон – скорость 120 км/ч, способен вместить 9 человек;
  • автобус – скорость 90 км/ч, способен вместить 30 человек.

Если одна операция – это передвижение одного человека на определенное расстояние (пусть будет 1 км), то задержка (время, за которое один человек пройдет 1 км) для первого авто составит 3600/120 = 30 сек, а пропускная способность – 9/30 = 0,3. Для автобуса – 3600/90 = 40 сек и 30/40 = 0,75.

CPU – это фургон, а GPU – автобус: у него большая задержка, но также и большая пропускная способность. Если для вашего задания задержка каждой конкретной операции не так важна, как количество этих самых операций в секунду, то стоит рассмотреть использование GPU.

Краткая инструкция

Тестовая конфигурация

Тестирование проводилось на следующей конфигурации:

Сервер:
Ubuntu 16.04, GeForce GTX 660

Клиент:
Виртуальная машина с Ubuntu 16.04 на ноутбуке без дискретной видеокарты.

Получение rCUDA

Cамый сложный этап. К сожалению, на данный момент единственный способ получить свой экземпляр этого фреймворка — заполнить соответствующую форму запроса на официальном сайте. Впрочем, разработчики обещают отвечать в течение 1-2 дней. В моём случае мне прислали дистрибутив в тот же день.

Установка CUDA

Важно! На клиенте следует отказаться от установки nvidia драйвера. По умолчанию CUDA Toolkit будет доступен по адресу /usr/local/cuda/. Установите CUDA Samples, они понадобятся.

Установка rCUDA

Распакуем полученный от разработчиков архив в нашу домашнюю директорию на сервере и на клиенте.

Проделать эти действия нужно как на сервере, так и на клиенте.

Запуск демона rCUDA на сервере

Замените < XXX> на имя вашего пользователя. Используйте ./rCUDAd -iv, если хотите видеть подробный вывод.

Настройка клиента

Откроем на клиенте терминал, в котором в дальнейшем будем запускать CUDA код. На стороне клиента нам необходимо "подменить" стандартные библиотеки CUDA на библиотеки rCUDA, для чего добавим соответствующие пути в переменную среды LD_LIBRARY_PATH. Также нам необходимо указать количество серверов и их адреса (в моём примере он будет один).

Сборка и запуск

Попробуем собрать и запустить несколько примеров.

Пример 1

Начнём с простого, с deviceQuery — примера, который просто выведет нам параметры CUDA совместимого устройства, то есть в нашем случае удалённого GTX660.

Важно! Без EXTRA_NVCCFLAGS=--cudart=shared чуда не получится
Замените <YYY> на путь, который вы указали для CUDA Samples при установке CUDA.

Запустим собранный пример:

Если вы всё сделали правильно, результат будет примерно таким:

Самое главное, что мы должны увидеть:

Отлично! Нам удалось собрать и запустить CUDA приложение на машине без дискретной видеокарты, использовав для этого видеокарту, установленную на удалённом сервере.

Важно! Если вывод приложения начинается со строк вида:

значит необходимо добавить на сервере и на клиенте в файл "/etc/security/limits.conf" следующие строки:

Таким образом, вы разрешите всем пользователям (*) неограниченное (unlimited) блокирование памяти (memlock). Еще лучше будет заменить * на нужного пользователя, а вместо unlimited подобрать менее жирные права.

Пример 2

Теперь попробуем что-то поинтереснее. Протестируем реализацию скалярного произведения векторов с использованием разделяемой памяти и синхронизации ("Технология CUDA в примерах" Сандерс Дж. Кэндрот Э. 5.3.1).

В данном примере мы рассчитаем скалярное произведение двух векторов размерностью 33 * 1024, сравнивая ответ с результатом, полученным на CPU.

Сборка и запуск:

Такой результат говорит нам, что всё у нас хорошо:

Пример 3

Запустим еще один стандартный тест CUDA- matrixMulCUBLAS (перемножение матриц).

[Matrix Multiply CUBLAS] — Starting…
GPU Device 0: "GeForce GTX 660" with compute capability 3.0

MatrixA(640,480), MatrixB(480,320), MatrixC(640,320)
Computing result using CUBLAS. done.
Performance= 436.24 GFlop/s, Time= 0.451 msec, Size= 196608000 Ops
Computing result using host CPU. done.
Comparing CUBLAS Matrix Multiply with CPU results: PASS

NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

Performance= 436.24 GFlop/s,
Comparing CUBLAS Matrix Multiply with CPU results: PASS
Безопасность

Я не нашёл в документации к rCUDA упоминания о каком-либо способе авторизации. Думаю, на данный момент самое простое, что можно сделать, это открыть доступ к нужному порту (8308) только с определённого адреса.

Выводы

Отличительными чертами GPU в сравнении с CPU являются:

  • архитектура, максимально нацеленная на увеличение скорости расчета текстур и сложных графических объектов;
  • предельная мощность типичного GPU намного больше, чем у CPU;
  • благодаря специализированной конвейерной архитектуре GPU более эффективен в обработке графической информации, нежели центральный процессор.

Главный минус CUDA в том, что данная технология поддерживается только видеокартами NVIDIA без каких-либо альтернатив.

Графический процессор не всегда может дать ускорение при выполнении определенных алгоритмов. Поэтому перед использованием GPU для вычислений стоит хорошо подумать, а нужен ли он в данном случае. Вы можете использовать видеокарту для сложных вычислений: работа с графикой или изображениями, инженерные расчеты, криптографические задачи (майнинг), и т. д., но не используйте GPU для решения простых задач (разумеется, вы можете, но тогда эффективность будет равняться нулю).

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

Читайте также: