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 )