Я исследовал тот же вопрос некоторое время назад. После обсуждения людям, которые работали над FPGAs, это - то, что я получаю:
, Если можно заставить CUDA работать на Вас, это - вероятно, наилучший вариант в данный момент. Это, конечно, будет более гибко, чем FPGA.
Другие опции включают Ручей от ATI, но до чего-то большого происходит, это просто также не принято как CUDA. После этого существуют все еще все традиционные опции HPC (кластеры x86/PowerPC/Cell), но они являются все довольно дорогими.
Hope, которая помогает.
Я пошел бы с CUDA.
я работаю в обработке изображений и пробовал аппаратные дополнения в течение многих лет. Сначала у нас было i860, затем Транспьютер, затем DSP, тогда FPGA и direct-compiliation-to-hardware.
то, Что неизбежно произошло, было то, что к тому времени, когда аппаратные платы были действительно отлажены и надежны, и код был портирован им - регулярные центральные процессоры совершенствовались для избиения их или измененной архитектуры машины хостинга, и мы не могли использовать старые платы, или производители платы обанкротились.
Путем придерживания чего-то как CUDA Вы не связываетесь с одним небольшим производителем специалиста плат FPGA. performence GPU улучшает быстрее тогда центральные процессоры и финансируется геймерами. Это - общепринятая технология и так вероятно, объединится с многоядерными центральными процессорами в будущем и тем самым защитит Ваши инвестиции.
Мы сделали некоторое сравнение между FPGA и CUDA. Одна вещь, где CUDA сияет, если Вы можете действительно сформулировать свою проблему способом SIMD И можете получить доступ к объединенной памяти. Если доступы памяти не объединяются (1) или если у Вас есть различный поток управления в различных потоках, GPU может потерять решительно свою производительность, и FPGA может превзойти его по характеристикам. Другая вещь состоит в том, когда Ваша операция относительна маленький, но у Вас есть огромная сумма его. Но Вы наклоняетесь (например, из-за синхронизации), никакие не запускают ее в цикле в одном ядре, тогда Ваши времена вызова для ядра GPU превышают время вычисления.
Также питание FPGA могло быть лучше (зависит от Вашего приложения scenarion, т.е. GPU является только более дешевым (с точки зрения Ватт/Переброса) когда его вычисление все время).
Offcourse FPGA имеет также некоторые недостатки: IO может быть одним (у нас было здесь приложение, были, нам были нужны 70 ГБ/с, без проблем для GPU, но получить этот объем данных в FPGA, Вам нужно для стандартного дизайна больше контактов, чем доступный). Другой недостаток является временем и деньгами. FPGA является намного более дорогим, чем лучший GPU и время разработки очень высок.
(1) доступы Simultanously от различного потока до памяти должны быть к последовательным адресам. Этого иногда действительно трудно достигнуть.
CUDA имеет довольно существенную кодовую базу примеров и SDK, включая бэкенд BLAS . Попытайтесь найти некоторые примеры подобными тому, что Вы делаете, возможно, также смотря серия GPU Gems книг, чтобы измерить, как хорошо CUDA будет соответствовать Вашим приложениям. Я сказал бы с логистической точки зрения, CUDA легче работать с и очень, намного более дешевый, чем какой-либо профессиональный инструментарий разработки FPGA.
Однажды я действительно изучал CUDA для резервного имитационного моделирования требования. Существует вполне хорошая серия лекций, связанных от веб-сайта для изучения. В Windows необходимо удостовериться, что CUDA работает на карте без дисплеев, поскольку графическая подсистема имеет сторожевой таймер, который уничтожит любой процесс, работающий больше 5 секунд. Это не происходит на Linux.
Любая машина с двумя PCI-e x16 слоты должна поддерживать это. Я использовал HP XW9300, который можно взять от eBay вполне дешево. Если Вы делаете, удостоверьтесь, что это имеет два ЦП (не один двухъядерный ЦП), поскольку слоты PCI-e живут на отдельных Гипертранспортных шинах, и Вам нужны два ЦП в машине для имения обеих активных шин.
Решение на основе FPGA, вероятно, будет намного дороже, чем CUDA.
Очевидно, это сложный вопрос. Вопрос может также относиться к клеточному процессору. И, вероятно, нет единого ответа, который был бы правильным для других связанных вопросов.
По моему опыту, любая реализация, выполненная абстрактным образом, то есть компилированный язык высокого уровня по сравнению с реализацией машинного уровня, неизбежно будет иметь потери производительности, особенно в реализация сложного алгоритма. Это верно как для FPGA, так и для процессоров любого типа. ПЛИС, разработанная специально для реализации сложного алгоритма, будет работать лучше, чем ПЛИС, элементы обработки которой являются общими, что обеспечивает определенную степень программируемости на основе регистров управления вводом, ввода-вывода данных и т. Д.
более высокая производительность достигается в каскадных процессах, где выходные данные процесса становятся входами для другого и не могут выполняться одновременно. Каскадные процессы в ПЛИС просты, и может значительно снизить требования к памяти ввода-вывода, в то время как память процессора будет использоваться для эффективного каскадирования двух или более процессов, в которых есть зависимости данных.
То же самое можно сказать о GPU и CPU. Алгоритмы, реализованные на языке C, выполняемые на процессоре, разработанном без учета характеристик производительности, присущих кэш-памяти или системе основной памяти, не будут работать так же хорошо, как реализованный. Конечно, неучет этих характеристик упрощает реализацию. Но ценой производительности.
Не имея прямого опыта работы с графическим процессором, но зная присущие ему проблемы с производительностью системы памяти, он тоже будет подвержен проблемам с производительностью.
То же самое можно сказать о GPU и CPU. Алгоритмы, реализованные на языке C, выполняемые на процессоре, разработанном без учета характеристик производительности, присущих кэш-памяти или системе основной памяти, не будут работать так же хорошо, как реализованный. Разумеется, неучет этих характеристик упрощает реализацию. Но ценой производительности.
Не имея прямого опыта работы с графическим процессором, но зная присущие ему проблемы с производительностью системы памяти, он также будет подвержен проблемам с производительностью.
То же самое можно сказать о GPU и CPU. Алгоритмы, реализованные на языке C, выполняемые на процессоре, разработанном без учета характеристик производительности, присущих кэш-памяти или системе основной памяти, не будут работать так же хорошо, как реализованный. Разумеется, неучет этих характеристик упрощает реализацию. Но ценой производительности.
Не имея прямого опыта работы с графическим процессором, но зная присущие ему проблемы с производительностью системы памяти, он тоже будет подвержен проблемам с производительностью.
На чем вы развертываете? Кто ваш покупатель? Даже не зная ответов на эти вопросы, я бы не стал использовать FPGA, если вы не создаете систему реального времени и в вашей команде нет инженеров-электриков / компьютерщиков, которые знают языки описания оборудования, такие как VHDL и Verilog. Здесь много всего, и это требует другого настроения, чем обычное программирование.
Я разработчик CUDA с очень небольшим опытом работы с FPGA: s, однако я пытался найти сравнения между ними.
К настоящему моменту я пришел к выводу:
Графический процессор имеет гораздо более высокую (доступную) пиковую производительность. У него более благоприятное соотношение FLOP / Вт. Это дешевле Он развивается быстрее (совсем скоро у вас будет буквально «настоящий» TFLOP). Программировать проще (прочтите статью об этом не личном мнении)
Обратите внимание, что я говорю «реальный / доступный», чтобы отличать от чисел, которые вы увидите в рекламе GPGPU.
НО графический процессор не более благоприятен, когда вам нужно делать случайный доступ к данным. Надеюсь, это изменится с новой архитектурой Nvidia Fermi, которая имеет дополнительный кэш l1 / l2.
мои 2 цента