Объяснение CUDA C и C ++ - PullRequest
20 голосов
/ 24 марта 2012

Может ли кто-нибудь дать мне хорошее объяснение природы CUDA C и C ++? Насколько я понимаю, CUDA должен быть C с библиотеками графических процессоров NVIDIA. На данный момент CUDA C поддерживает некоторые функции C ++, но не другие.

Каков план NVIDIA? Собираются ли они опираться на C и добавлять свои собственные библиотеки (например, Thrust vs. STL), параллельные библиотекам C ++? Будут ли они в конечном итоге поддерживать весь C ++? Разве плохо использовать заголовки C ++ в файле .cu?

Ответы [ 5 ]

19 голосов
/ 27 марта 2012

CUDA - это платформа (архитектура, модель программирования, виртуальная машина сборки, инструменты компиляции и т. Д.), А не просто один язык программирования.CUDA C - только одна из ряда языковых систем, построенных на этой платформе (CUDA C, C ++, CUDA Fortran, PyCUDA, другие.)

CUDA C ++

В настоящее время CUDA C ++ поддерживает подмножествоC ++, описанного в Приложении D («Поддержка языков C / C ++») Руководство по программированию CUDA C .

Назовите несколько:

  • Классы
  • __device__ функции-члены (включая конструкторы и деструкторы)
  • Наследование / производные классы
  • виртуальные функции
  • шаблоны классов и функций
  • операторы и перегрузка
  • классы функторов

Редактировать: начиная с CUDA 7.0, CUDAC ++ включает в себя поддержку большинства языковых функций стандарта C ++ 11 в коде __device__ (код, который выполняется на GPU), включая auto, лямбда-выражения, циклы на основе диапазона, списки инициализаторов, статическое утверждение и многое другое.

Примеры и конкретные ограничения также подробно описаны в том же приложении, которое приведено выше.В качестве очень зрелого примера использования C ++ с CUDA я рекомендую проверить Тяга .

Планы на будущее

(Раскрытие информации: я работаю на NVIDIA.)

Я не могу точно сказать о будущих выпусках и сроках, но я могу проиллюстрировать тенденцию, что почти в каждом выпуске CUDA добавлены дополнительные языковые функции, чтобы получить поддержку CUDA C ++ до ее текущего (на мой взгляд, очень полезного) состояния.Мы планируем продолжить эту тенденцию в улучшении поддержки C ++, но, естественно, мы отдаем предпочтение функциям, которые являются полезными и производительными для массивно-параллельной вычислительной архитектуры (GPU).

19 голосов
/ 24 марта 2012

CUDA C - это язык программирования с синтаксисом C.Концептуально он сильно отличается от C.

Проблема, которую он пытается решить, заключается в кодировании нескольких (похожих) командных команд для нескольких процессоров.

CUDA предлагает более чем одну векторную обработку множественных данных (SIMD), но потоки данных >> потоки команд, или это дает гораздо меньше преимуществ.

CUDA предоставляет некоторые механизмы для этого, искрывает некоторую сложность.

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

CUDA поддерживает «циклы», которые могут выполняться параллельно.Это его самая важная особенность.Система CUDA будет разделять выполнение «циклов» и запускать тело «циклов» одновременно на массиве идентичных процессоров, одновременно предоставляя некоторую иллюзию обычного последовательного цикла (в частности, CUDA управляет «индексом» цикла).Разработчик должен знать структуру машины с графическим процессором, чтобы эффективно писать «петли», но почти все управление выполняется во время выполнения CUDA.Эффект состоит в том, что сотни (или даже тысячи) «циклов» завершаются одновременно с одним «циклом».

CUDA поддерживает то, что выглядит как if ветви.Только процессоры, выполняющие код, соответствующий тесту if, могут быть активными, поэтому подмножество процессоров будет активным для каждой «ветви» теста if.Как пример это if... else if ... else ..., имеет три ветви.Каждый процессор будет выполнять только одну ветвь и будет «повторно синхронизирован» и готов к работе с остальными процессорами после завершения if.Возможно, что некоторые условия ветвления не соответствуют ни одному процессору.Таким образом, нет необходимости выполнять эту ветку (для этого примера три ветви - наихудший случай).Затем только одна или две ветви выполняются последовательно, быстрее завершая все if.

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

CUDA не принимает старый код C / C ++ и автоматически 10 * * выполняет вычисления на множестве процессоров.CUDA может компилировать и запускать обычный C и большую часть C ++ последовательно, но это очень мало (ничего?), Которое можно получить, потому что он будет работать последовательно и медленнее, чем современный процессор.Это означает, что код в некоторых библиотеках (пока) не очень хорошо соответствует возможностям CUDA.Программа CUDA может работать одновременно с бит-векторами размером несколько килобайт.CUDA не может автоматически волшебно преобразовать существующий последовательный код библиотеки C / C ++ во что-то, что могло бы сделать это.

CUDA обеспечивает относительно простой способ написания кода, используя знакомый CСинтаксис / C ++ добавляет несколько дополнительных понятий и генерирует код, который будет работать с массивом процессоров.Он может дать более чем 10-кратное ускорение по сравнению, например, с многоядерным процессором x86.

Редактировать - Планы: я не работаю с NVIDIA

Для максимальной производительности CUDA требует информацию при компиляциивремя.

Таким образом, механизмы шаблонов являются наиболее полезными, поскольку они дают разработчику возможность говорить вещи во время компиляции, которые может использовать компилятор CUDA.В качестве простого примера, если во время компиляции определяется (создается) матрица, которая должна быть 2D и 4 x 8, то компилятор CUDA может работать с этим, чтобы организовать программу по процессорам.Если этот размер является динамическим и изменяется во время работы программы, компилятору или системе времени выполнения будет намного труднее выполнять очень эффективную работу.

РЕДАКТИРОВАТЬ: CUDA имеет класси шаблоны функций.Я прошу прощения, если люди читают это как высказывание CUDA.Я согласен, мне было не ясно.

Я считаю, что реализация шаблонов на стороне графического процессора CUDA не является полной по сравнению с C ++.

Пользовательский комментарий сказал, что мой ответ вводит в заблуждение. Гаррисм работает на NVIDIA, поэтому я буду ждать совета. Надеюсь, это уже понятнее.

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

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

AFAIK (по модулю обратной связи), компилятор CUDA еще не является современным в этих областях.

(ИМХО для тех, кто заинтересован в CUDA или OpenCL-совместимой системе, стоит потратить несколько дней, чтобы исследовать их и провести некоторые эксперименты. Я также думаю, что для людей, заинтересованных в этих областях, это стоит усилий поэкспериментировать с Haskell и взглянуть на Data Parallel Haskell )

5 голосов
/ 20 октября 2013

Многие не понимают, что CUDA на самом деле является двумя новыми языками программирования, оба являются производными от C ++.Один для написания кода, который работает на графических процессорах и является подмножеством C ++.Его функция аналогична HLSL (DirectX) или Cg (OpenGL), но с большим количеством функций и совместимостью с C ++.К нему относятся различные проблемы, связанные с GPGPU / SIMT / производительностью, которые я не должен упоминать.Другой - это так называемый «API времени выполнения», который вряд ли является «API» в традиционном смысле.API времени выполнения используется для написания кода, который выполняется на центральном процессоре хоста.Это расширенный набор C ++, который значительно упрощает компоновку и запуск кода GPU.Для этого требуется прекомпилятор NVCC, который затем вызывает компилятор платформы C ++.Напротив, Driver API (и OpenCL) - это чистая стандартная библиотека C, и она гораздо более многословна в использовании (хотя и предлагает несколько дополнительных функций).

Создание нового языка программирования на стороне хоста было смелымдвигаться со стороны NVIDIA.Это облегчает начало работы с CUDA и делает написание кода более элегантным.Тем не менее, поистине блестящим было не рекламировать его как новый язык.

2 голосов
/ 24 марта 2012

Иногда вы слышите, что CUDA - это C и C ++, но я не думаю, что это так, по той простой причине, что это невозможно. Цитировать из их руководства по программированию:

Для кода хоста nvcc поддерживает любую часть C ++ ISO / IEC 14882: 2003 спецификация, поддерживаемая компилятором хоста c ++.

Для кода устройства nvcc поддерживает функции, показанные в разделе D.1 с некоторыми ограничениями, описанными в разделе D.2; Это не поддержка информации о типе времени выполнения (RTTI), обработке исключений и Стандартная библиотека C ++.

Как я вижу, он относится только к C ++ и поддерживает только C, если это происходит на пересечении C и C ++. Так что лучше думать о нем как о C ++ с расширениями для части устройства, а не C. Это избавит вас от головной боли, если вы привыкли к C.

1 голос
/ 24 марта 2012

Каков план NVIDIA?

Я считаю, что общая тенденция заключается в том, что CUDA и OpenCL рассматриваются как методы слишком низкого уровня для многих приложений. Прямо сейчас Nvidia инвестирует значительные средства в OpenACC , который можно грубо назвать OpenMP для графических процессоров. Он следует декларативному подходу и решает проблему распараллеливания GPU на гораздо более высоком уровне. Так что это мое абсолютно субъективное впечатление от плана Nvidia.

...