CUDA или FPGA для специальных вычислений 3D-графики?

StackOverflow https://stackoverflow.com/questions/317731

  •  11-07-2019
  •  | 
  •  

Вопрос

Я разрабатываю продукт с большими объемами вычислений в 3D-графике, в значительной степени поиск ближайшей точки и диапазона.Некоторая аппаратная оптимизация была бы полезна.Хотя я мало что знаю об этом, мой босс (у которого нет опыта работы с программным обеспечением) выступает за FPGA (потому что ее можно адаптировать), в то время как наш младший разработчик выступает за GPGPU с CUDA, потому что это дешево, горячо и открыто.Хотя я чувствую, что мне не хватает здравого смысла в этом вопросе, я считаю, что CUDA - это правильный путь еще и потому, что я беспокоюсь о гибкости, наш продукт все еще находится в стадии активной разработки.

Итак, перефразируя вопрос, есть ли вообще какие-либо причины переходить на FPGA?Или есть третий вариант?

Это было полезно?

Решение

Некоторое время назад я исследовал тот же вопрос.После общения с людьми, которые работали над ПЛИС, вот что я получаю:

  • ПЛИС отлично подходят для систем реального времени, где задержка даже в 1 мс может быть слишком большой.В вашем случае это неприменимо;
  • ПЛИС могут быть очень быстрыми, особенно для четко определенных методов цифровой обработки сигналов (например,данные радара), но хорошие из них намного дороже и специализированы, чем даже профессиональные GPGPU;
  • ПЛИС довольно громоздки в программировании.Поскольку для компиляции требуется компонент аппаратной конфигурации, это может занять несколько часов.По-видимому, он больше подходит инженерам-электронщикам (которые, как правило, работают на ПЛИС), чем разработчикам программного обеспечения.

Если вы можете заставить CUDA работать на вас, это, вероятно, лучший вариант на данный момент.Это, безусловно, будет более гибким, чем ПЛИС.

Другие варианты включают Brook от ATI, но пока не произойдет чего-то масштабного, он просто не так хорошо принят, как CUDA.После этого остаются все традиционные опции HPC (кластеры x86 / PowerPC / Cell), но все они довольно дорогие.

Надеюсь, это поможет.

Другие советы

Мы провели некоторое сравнение между FPGA и CUDA. Одна вещь, где CUDA сияет, если вы действительно можете сформулировать свою проблему в SIMD-стиле И можете получить доступ к объединившейся памяти. Если доступ к памяти не объединен (1) или если у вас разные потоки управления в разных потоках, графический процессор может значительно потерять свою производительность, а FPGA может превзойти его. Другое дело, когда ваша операция очень мала, но у вас ее огромное количество. Но вы не можете (например, из-за синхронизации) не запускать его в цикле в одном ядре, тогда время вашего вызова для ядра GPU превышает время вычислений.

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

Конечно, у FPGA есть и некоторые недостатки: IO может быть одним (у нас было приложение, где нам было нужно 70 ГБ / с, нет проблем для GPU, но чтобы получить этот объем данных в FPGA, который вам нужен для обычного проектирования, больше булавки чем доступны). Еще один недостаток - время и деньги. FPGA намного дороже, чем лучший GPU, и время разработки очень велико.

(1) Одновременный доступ из разных потоков к памяти должен осуществляться по последовательным адресам. Это иногда очень трудно достичь.

Я бы пошел с CUDA.
Я работаю в области обработки изображений и уже много лет пробую дополнения к оборудованию. Сначала у нас был i860, затем Transputer, затем DSP, затем FPGA и аппаратная прямая компиляция.
То, что неизбежно произошло, состояло в том, что к тому времени, когда аппаратные платы были действительно отлажены и надежны, и код был перенесен на них - обычные ЦП продвинулись вперед, или архитектура хост-машины изменилась, и мы не могли использовать старые платы, или создатели доски обанкротились.

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

ПЛИС

  • То, что вам нужно:
    • Изучайте VHDL / Verilog (и поверьте мне, вы этого не сделаете)
    • Купить hw для тестирования, лицензии на инструменты синтеза
    • Если вы выберете какой-нибудь хороший фреймворк (например.: RSoC)
      • Разработка дизайна ( а это может занять годы )
    • Если ты этого не сделаешь:
      • DMA, драйвер hw, сверхдорогие инструменты синтеза
      • тонны знаний о шинах, отображении памяти, синтезе hw
      • соберите hw, купите ip-ядра
      • Разработать дизайн
  • Например, средняя плата FPGA pcie с чипом Xilinx virtex-6 стоит более 3000 долларов
  • Результат:
    • Если вам не платит правительство, у вас недостаточно средств.

GPGPU (CUDA/OpenCL)

  • У вас уже есть hw для тестирования.
  • Сравните с материалами FPGA:
    • Все хорошо задокументировано .
    • Все здесь дешево
    • Все работает
    • Все хорошо интегрировано с языками программирования
  • Существует также облако графических процессоров.
  • Результат:
    • Вам нужно просто загрузить sdk, и вы можете начинать.

Решение на основе FPGA, вероятно, будет намного дороже, чем CUDA.

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

По моему опыту, любая реализация, выполненная в абстрактной манере, то есть скомпилированная реализация языка высокого уровня по сравнению с реализацией на уровне машины, неизбежно будет иметь снижение производительности, особенно в реализации сложного алгоритма. Это верно как для FPGA, так и для процессоров любого типа. FPGA, разработанная специально для реализации сложного алгоритма, будет работать лучше, чем FPGA, чьи элементы обработки являются общими, что обеспечивает определенную степень программируемости из регистров управления вводом, ввода-вывода данных и т. Д.

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

То же самое можно сказать о GPU и CPU. Алгоритмы, реализованные на С, выполняемые на ЦП, разработанные без учета присущих характеристик производительности кэш-памяти или системы основной памяти, не будут работать так же хорошо, как реализованный, который работает. Конечно, если не учитывать эти характеристики производительности, это упрощает реализацию. Но за счет производительности.

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

Это старый поток, начатый в 2008 году, но было бы хорошо рассказать о том, что случилось с программированием на ПЛИС с тех пор: 1. C to gates в FPGA является основной разработкой для многих компаний с ОГРОМНОЙ экономией времени по сравнению с Verilog / SystemVerilog HDL. В C до ворот дизайн системы уровня является сложной частью. 2. OpenCL на FPGA существует уже более 4 лет, в том числе с плавающей запятой и «облаком». развертывание Microsoft (Asure) и Amazon F1 (Ryft API). С OpenCL проектирование системы относительно просто из-за очень четко определенной модели памяти и API между хост-компьютерами и вычислительными устройствами.

Специалистам по программному обеспечению просто необходимо немного узнать об архитектуре FPGA, чтобы иметь возможность делать вещи, которые даже невозможно с графическими процессорами и процессорами, по причине того, что они являются фиксированными и не имеют широкополосных (100 Гбит +) интерфейсов с внешним миром. Уменьшение геометрии чипа больше невозможно, равно как и выделение большего количества тепла из пакета с одной микросхемой без его плавления, поэтому это выглядит как конец пути для чипов с одной упаковкой. Мой тезис здесь состоит в том, что будущее принадлежит параллельному программированию многочиповых систем, и FPGA имеют большие шансы быть впереди игры. Проверьте http://isfpga.org/ , если у вас есть проблемы с производительностью и т. Д.

CUDA имеет довольно обширную базу кодов примеров и SDK , включая < a href = "http://www.nvidia.com/content/cudazone/cuda_sdk/Linear_Algebra.html" rel = "nofollow noreferrer"> серверная часть BLAS . Попробуйте найти примеры, похожие на то, что вы делаете, возможно, также посмотрите на GPU Gems , чтобы оценить, насколько хорошо CUDA подойдет для ваших приложений. Я бы сказал, с точки зрения логистики, с CUDA легче работать и намного, намного дешевле, чем с любым профессиональным инструментарием для разработки FPGA.

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

Любая машина с двумя слотами PCI-e x16 должна поддерживать это. Я использовал HP XW9300, который вы можете купить на Ebay довольно дешево. Если вы это сделаете, убедитесь, что у него есть два ЦП (не один двухъядерный ЦП), поскольку слоты PCI-e находятся на отдельных шинах Hypertransport, и вам нужно два ЦП на машине, чтобы обе шины были активны.

Я разработчик CUDA с очень небольшим опытом работы с FPGA, однако я пытался найти сравнение между ними.

К чему я пришел к выводу:

GPU имеет гораздо более высокую (доступную) пиковую производительность Он имеет более благоприятное соотношение FLOP / Watt. Это дешевле Он развивается быстрее (довольно скоро у вас будет буквально «настоящий» TFLOP). Проще программировать (читай статью по этому не личному мнению)

Обратите внимание, что я говорю "реальный / доступный", чтобы отличать его от цифр, которые вы увидите в рекламе GPGPU.

НО графическая карта не является более благоприятной, если вам необходимо осуществлять произвольный доступ к данным. Надеемся, что это изменится с новой архитектурой Nvidia Fermi, которая имеет дополнительный кэш l1 / l2.

мои 2 цента

ПЛИС не будет одобрена теми, кто склонен к программному обеспечению, поскольку им необходимо изучить язык HDL или хотя бы понять systemC.

Для тех с аппаратным смещением FPGA будет первым выбранным вариантом.

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

OpenCL предназначен для работы как на FPGA, так и на amp; GPU, даже CUDA можно перенести на FPGA.

FPGA & amp; Графические ускорители могут использоваться вместе

Так что дело не в том, что лучше того или другого. Существует также дискуссия о CUDA против OpenCL

Опять же, если вы не оптимизировали & amp; сравнив их с вашим конкретным приложением, вы не можете знать со 100% уверенностью.

Многие просто пойдут с CUDA из-за его коммерческой природы & amp; Ресурсы. Другие будут использовать openCL из-за его универсальности.

На чем вы развертываете? Кто ваш клиент? Даже не зная ответов на эти вопросы, я бы не стал использовать ПЛИС, если вы не строите систему реального времени и в вашей команде нет инженеров-электриков и компьютерщиков, знающих языки описания аппаратного обеспечения, такие как VHDL и Verilog. В этом много чего, и для этого нужно другое настроение, чем в обычном программировании.

ПЛИС потеряли популярность в секторе высокопроизводительных вычислений, потому что они являются ужасом для программирования. CUDA работает потому, что программирование намного приятнее и все равно даст вам хорошую производительность. Я хотел бы пойти с тем, что произошло с сообществом HPC, и сделать это в CUDA. Это проще, дешевле, удобнее в обслуживании.

Другие дали хорошие ответы, просто хотели добавить другую точку зрения. Вот моя статья , опубликованная в ACM Computing Surveys 2015, опубликованная в статье ACM Computing Surveys 2015, которая опубликована в ACM http: : //dl.acm.org/citation.cfm? doid = 2658850.2636342 "rel =" nofollow "> здесь ), который сравнивает GPU с FPGA и CPU по показателю энергоэффективности. В большинстве статей сообщается: FPGA более энергоэффективен, чем GPU, который, в свою очередь, более энергоэффективен, чем CPU. Поскольку бюджеты энергопотребления являются фиксированными (в зависимости от возможностей охлаждения), эффективность использования энергии ПЛИС означает, что можно выполнить больше вычислений в рамках одного и того же бюджета мощности с ПЛИС и, таким образом, получить лучшую производительность с ПЛИС, чем с графическим процессором. Конечно, также учитывают ограничения ПЛИС, как упоминалось другими.

  • ПЛИС более параллельны, чем графические процессоры, на три порядка.В то время как хороший графический процессор имеет тысячи ядер, ПЛИС может иметь миллионы программируемых вентилей.
  • В то время как ядра CUDA должны выполнять очень похожие вычисления, чтобы быть производительными, ячейки FPGA действительно независимы друг от друга.
  • ПЛИС могут работать очень быстро с некоторыми группами задач и часто используются там, где миллисекунда уже воспринимается как большой срок.
  • Ядро графического процессора намного мощнее, чем ячейка FPGA, и его намного проще программировать.Это ядро, которое может делиться и умножаться без проблем, когда ячейка FPGA способна только на довольно простую булеву логику.
  • Поскольку ядро графического процессора представляет собой Ядро, эффективно запрограммировать его на C ++.Даже если ПЛИС и можно запрограммировать на C ++, это неэффективно (просто "продуктивно").Необходимо использовать специализированные языки, такие как VDHL или Verilog - они сложны в освоении.
  • Большинство истинных и испытанных инстинктов инженера-программиста бесполезны с ПЛИС.Ты хочешь для цикла с этими воротами?Из какой вы галактики?Вам нужно изменить образ мышления инженера-электронщика, чтобы понять этот мир.

Не позднее GTC'13 многие представители HPC согласились, что CUDA здесь, чтобы остаться. FGPA громоздки, CUDA становится более зрелой, поддерживая Python / C / C ++ / ARM ... в любом случае, это был устаревший вопрос

Программирование GPU в CUDA определенно проще. Если у вас нет опыта программирования FPGA в HDL, это почти наверняка станет для вас слишком сложной задачей, но вы все равно можете программировать их с помощью OpenCL, что-то вроде CUDA. Однако его сложнее реализовать и, вероятно, намного дороже, чем программировать графические процессоры.

Какой из них быстрее?

GPU работает быстрее, но FPGA может быть более эффективным.

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

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

Это похоже на то, что ты ешь свой суп очень быстро, а не медленнее.

Оба устройства основывают свою производительность на распараллеливании, но каждое несколько отличается. Если алгоритм можно разбить на множество частей, выполняющих одни и те же операции (ключевое слово: SIMD), графический процессор будет работать быстрее. Если алгоритм можно реализовать в виде длинного конвейера, FPGA будет быстрее. Кроме того, если вы хотите использовать с плавающей запятой, FPGA будет не очень доволен:)

Этой теме я посвятил всю магистерскую работу.

scroll top