CUDA还是FPGA用于特定目的的3D图形计算?

58
我正在开发一个需要进行重型3D图形计算的产品,其中最需要进行的是点和范围搜索。一些硬件优化会非常有用。虽然我对此了解不多,但我的老板(没有软件经验)主张采用FPGA(因为它可定制),而我们的初级开发人员则主张使用CUDA的GPGPU,因为它便宜、热门且开放。虽然我对这个问题缺乏判断力,但我认为CUDA是正确的选择,因为我担心灵活性,我们的产品仍在强烈开发中。

因此,重新表述问题,是否有任何理由支持FPGA?或者有第三个选择吗?


3
很想知道人们如何看待Cell与另外两种技术相比的优劣。 - 0fnt
15个回答

49

我之前调查了同样的问题。在与从事FPGA工作的人交谈后,我得出了以下结论:

  • FPGA非常适用于实时系统,即使1毫秒的延迟也可能太长。但这并不适用于你的情况;
  • FPGA可以非常快速,特别是对于定义明确的数字信号处理应用(例如雷达数据),但好的FPGA比专业的GPGPU还要昂贵和专业化;
  • 编写FPGA程序相当麻烦。由于编译中有硬件配置组件,可能需要数小时的时间。它似乎更适合电子工程师(通常是从事FPGA工作的人)而不是软件开发人员。

如果您能让CUDA为您工作,那么它可能是目前最好的选择。它肯定比FPGA更灵活。

其他选择包括来自ATI的Brook,但除非发生重大事件,否则它不如CUDA被广泛采用。此外,还有所有传统的高性能计算选项(x86 / PowerPC / Cell集群),但它们都相当昂贵。

希望对您有所帮助。


39
“CUDA比FPGA更加灵活”是错误的。对于CUDA,您必须以非常特定的方式扭曲和调整算法才能享受加速效果。而使用FPGA,您可以自由地实现专门为您的算法量身定制的计算例程。当然,这需要HDL编程知识,因此CUDA确实更适合软件程序员使用。 - Eli Bendersky
6
现在可以使用OpenCL对FPGA进行编程 - https://www.altera.com/products/design-software/embedded-software-developers/opencl/overview.html。这将使FPGA对软件程序员更具吸引力。 - ProfNimrod
1
这里有一篇很棒的文章,讨论了为什么美国军方正在放弃FPGA而转向GPU。它讨论了两者之间的浮点精度、延迟、直接内存访问和功耗差异。 - Stan
1
这篇支持FPGA的文章指出,你“不仅要看原始计算能力,还要考虑它们的模型如何跨越计算元素中的各种内存以及在节点内部和节点之间多个元素之间进行扩展”。 - Stan

49
我们对FPGA和CUDA进行了比较。如果您能以SIMD的方式确切地表达问题并可以访问内存连续,那么CUDA就会发挥其优势。但是,如果内存访问不是连续的(1),或者如果不同线程之间有不同的控制流,则GPU的性能会急剧下降,而FPGA可以胜过它。另一个方面是,当您的操作相对较小但需要进行大量运算时,如果您不能在一个内核中循环启动它(例如由于同步原因),那么调用GPU内核的时间将超过计算时间。
此外,FPGA的性能可能更好(这取决于您的应用场景,即当GPU一直在计算时,它只比Flop更便宜(以Watts/Flop为衡量))。
当然,FPGA也有一些缺点:输入/输出可能是其中之一(我们在这里需要70GB/s的应用程序,GPU没有问题,但要把这么多数据传输到FPGA,您需要使用比可用数量更多的引脚来设计)。另一个缺点是时间和金钱。FPGA比最好的GPU要贵得多,并且开发时间非常长。
(1)不同线程同时访问内存必须是顺序地址。这有时真的很难实现。

好答案。虽然其他答案证实了我们已经研究过的内容,但你提供了一些具体的例子,说明何时使用“either”或“or”更好。谢谢。 - Fredriku73
70GB/s的数值有问题吗?最新的Fermi(2010)具有16个PCIe v2.0通道,速度为8GB/s。显卡上的内存(GDDR5)可以达到54.4GB/s的速度。虽然速度很快,但可用的内存只有几GB。 - name
3
一款高端FPGA在IO带宽方面肯定可以胜过GPGPU。一个PCIe Gen2 x16接口可以传输16500MB0.8(采用8b/10b的数据编码方案)= 6.4GB/sec的有效负载数据。对于拥有48个收发器的高端Xilinx Virtex6 FPGA,该数据至少要乘以10。 - OutputLogic
3
我原始的帖子是从2008年发出的,当时还不存在Virtex6(甚至在2011年也很难获得大量高质量的芯片),但是你是对的,现在6.4 x 10 GB/sec = 64 GB/s是可能的,但是GPGPU也在不断发展,它们的吞吐量现在已经超过120 GB/s。 - flolo

15

我会选择CUDA。
我从事图像处理工作已经多年,一直在尝试硬件附加设备。首先是i860,然后是Transputer,然后是DSP,再然后是FPGA和直接编译到硬件中。
不可避免地发生的是,当硬件板真正调试和可靠,并且代码已经移植到它们上面时,常规CPU已经超越了它们,或者托管机器架构发生了变化,我们无法使用旧的板子,或者板子制造商破产了。

通过坚持使用像CUDA这样的东西,您不会被绑定在一个小型专业FPGA板制造商上。 GPU性能的提升速度比CPU快,由玩家资助。 它是一种主流技术,因此将来可能会与多核CPU合并,从而保护您的投资。


CPU并没有再像以前那样快速进步了。不过,我们现在有了类似的Xeon Phi(512位SIMD)。 - Dmitri Nesteruk
我听到你@MartinBeckett关于独立于FPGA的想法。但请记住,nvidia的UnifiedDeviceArch仅在nVIDIA芯片上表现出色;-)因此,您仍然会有依赖性。这就是为什么基于LLVM强大代码库的SPIR的OpenCL 2.0似乎是正确的选择(2016年2月)。 - Nikos Yotis
@NikYotis,这是在08年写的,我说过“类似CUDA”的东西。今天,如果您需要解决一般性问题,我会看一下OpenCL,但是如果您现在需要最高性能,则CUDA可能更胜一筹。 - Martin Beckett
1
我希望OpenCL 2.0与SPIR-V以及AMD Radeon能够打破nVIDIA的垄断。 - Nikos Yotis
我想知道你的“通常的CPU已经超越它们”的开发/调试周期有多长。 目前,FPGA比CPU慢1-2个技术节点,而在FPGA上并行和流水线执行迭代程序的性能无法被CPU所超越... - vijayvithal

10

FPGA

  • 你需要:
    • 学习VHDL / Verilog(相信我,你不想学)
    • 购买测试硬件和合成工具的许可证
    • 如果您已经拥有基础设施,并且只需要开发核心部分
      • 设计开发(可能需要几年时间)
    • 如果没有:
      • DMA,硬件驱动程序,超级昂贵的合成工具
      • 大量关于总线,内存映射,硬件综合的知识
      • 构建硬件,购买IP核
      • 设计开发
      • 不要忘记板开发
  • 例如,带有芯片Xilinx ZynqUS +的平均FPGA PCIe卡的成本超过3000美元
  • FPGA云也很昂贵2美元/小时+
  • 结果:
    • 这至少需要运行公司的资源。

GPGPU(CUDA / OpenCL)

  • 您已经有可测试的硬件。
  • 与FPGA相比:
    • 所有东西都有很好的文档。
    • 所有东西都很便宜
    • 所有东西都能用
    • 所有东西都与编程语言很好地集成
  • 也有GPU云。
  • 结果:
    • 您只需下载SDK,即可开始使用。

5
现在学习OpenCL就足以编程FPGA了 - https://www.altera.com/products/design-software/embedded-software-developers/opencl/overview.html,考虑到功率的主要重要性以及FPGA相对于GPU具有类似性能但更低的功率需求,因此FPGA现在为许多问题类型提供了一个有吸引力的替代选择。 - ProfNimrod
1
我同意@ProfNimrod的观点。nvidia的UnifiedDeviceArch只在nVIDIA芯片上表现出色;-)因此,您仍然需要依赖它。这就是为什么基于LLVM强大代码库的SPIR的OpenCL 2.0似乎是正确的选择(2016年2月)。 - Nikos Yotis

4
这是一个早在2008年就开始的旧帖子,但回顾自那时以来FPGA编程的情况会很有意义: 1. C语言到FPGA门电路的转换已经成为许多公司主流的开发方式,相比Verilog / SystemVerilog HDL节省了大量时间。在C语言到FPGA门电路的转换中,系统级设计是最困难的部分。 2. 自4年前起,OpenCL已经在FPGA上使用,包括支持浮点运算和由Microsoft(Asure)和Amazon F1(Ryft API)提供的“云”部署。采用OpenCL进行系统设计相对容易,因为它具有非常明确定义的主机和计算设备之间的内存模型和API。
软件人员只需要学习一些关于FPGA体系结构的知识,就能够做出GPU和CPU无法实现的事情,原因是它们都是固定的硅片并且没有外界宽带(100Gb +)接口。缩小芯片几何尺寸已不再可能,也不能从单个芯片封装中提取更多的热量,因此这看起来像是单个封装芯片的终结。我的观点是,未来属于多芯片系统的并行编程,而FPGA有很大机会领先于游戏。如果您对性能等方面有疑问,请查看http://isfpga.org/

这个话题更适合发布在电子工程数据科学板块。 - thewaywewere
1
OpenCL在FPGA上消除了这些分割。FPGA逻辑结构成为计算资源。 - My Name

4

显然这是一个复杂的问题,问题可能还涉及到单元处理器。对于其他相关问题,可能没有一个正确的答案。

根据我的经验,在抽象的实现中,即使用编译后的高级语言与机器级别的实现相比,复杂算法实现不可避免地会有性能损失。这对于任何类型的FPGA和处理器都是适用的。专门设计用于实现复杂算法的FPGA将比其处理元素为通用型、允许从输入控制寄存器、数据I/O等进行编程的FPGA表现更好。

另一个常见的例子,其中一个FPGA可以具有更高的性能,是在串联进程中,其中一个处理过程的输出变为另一个进程的输入,它们无法同时完成。在FPGA中串联进程很简单,而且可以大大降低内存I/O需求,而处理器内存将被用于有效地串联两个或多个存在数据依赖关系的进程。

同样适用于GPU和CPU。使用C实现的算法在CPU上执行,如果没有考虑缓存内存或主内存系统的固有性能特征,它的性能就不会像那些有这种考虑的实现一样好。当然,不考虑这些性能特征可以简化实现。但会以性能为代价。

我没有直接使用过GPU,但知道它固有的内存系统性能问题,因此它也会面临性能问题。


3
  • FPGAs比GPU更加并行,数量级高达三个数量级。虽然好的GPU具有数千个核心,FPGA可能有数百万个可编程门。
  • 虽然CUDA核必须执行高度相似的计算才能提高生产力,但FPGA单元是真正独立的。
  • FPGA在某些任务组中非常快速,并且通常用于毫秒已被视为长时间的情况。
  • GPU核比FPGA单元强大得多,并且更容易编程。它是一个核心,可以进行除法和乘法操作,而FPGA单元只能处理相对简单的布尔逻辑。
  • 由于GPU核是“核心”,因此使用C++来编程效率很高。即使可以使用C++编程FPGA,但它是低效的(只是“生产力高”)。必须使用专用语言如VDHL或Verilog-它们难以掌握。
  • 软件工程师的大部分直觉在FPGA上都是无用的。你想用这些门实现“for loop”吗?你来自哪个星系?您需要转变为电子工程师的思维方式才能理解这个世界。

1
我完全不同意这个评论。一开始还不错,但最后提供的信息并不完全正确。让我们只谈事实:1.两个主要的FPGA供应商都有C语言驱动的FPGA工具流程。2.尽管在2013-2015年期间发生了一些问题,但OpenCL从两家供应商来看都已经比较稳定和成熟。不需要再使用Verilog或VHDL。3.是的,在C/OpenCL中使用循环对于FPGAs非常好用,有些甚至比GPU更快。4.软件工程师的思维方式必须改变 - 这是真的。集群计算是未来趋势:TPU、DGX-1、Azure、AWS... 5.FPGA不是固定硅片 - 现在FPGA中几乎可以实现任何功能。 - My Name

3

其他人已经给出了很好的回答,我想加入不同的角度。这里是我在ACM Computing Surveys 2015发表的调查论文(其永久链接在此处),比较了GPU、FPGA和CPU在能效指标上的表现。大多数文章报告:FPGA比GPU更节能,而GPU又比CPU更节能。由于功率预算是固定的(取决于冷却能力),FPGA的能效意味着在相同的功率预算下可以进行更多的计算,并因此获得比GPU更好的性能。当然,也要考虑到FPGA的限制,正如其他人所提到的。


1
FPGAs的优势不仅仅在于功耗。FPGAs具有宽带接口,使它们能够直接获取数据,而无需经过服务器系统内存。在FPGAs上,我们可以完全忘记约翰·冯·诺伊曼,并且比GPU / CPU做得更好。 - My Name

3
我是一名CUDA开发者,对FPGA几乎没有经验,但我一直在试图找到两者之间的比较。
目前我得出的结论是:
GPU具有更高的(可访问的)峰值性能。
它拥有更有利的每瓦FLOP比率。
它更便宜。
它发展速度更快(很快你将可以获得“真正”的TFLOP)。
它更容易编程(这不是个人意见,请阅读相关文章)。
请注意,我所说的“真正/可访问”是为了区别于您在GPGPU商业中看到的数字。
但是,当您需要对数据进行随机访问时,GPU并不更有利。这将随着新的Nvidia Fermi架构的推出而有所改变,该架构具有可选的L1/L2缓存。
以上仅代表个人观点。

3
CUDA拥有相当丰富的示例代码库和SDK,包括BLAS后端。尝试查找一些类似于您正在处理的示例,也可以查看GPU Gems系列书籍,以评估CUDA在应用程序中的适用性。从物流角度来看,我认为CUDA比任何专业FPGA开发工具包更易于使用,成本也更低得多。
曾经我研究过CUDA用于索赔准备模拟建模。有一系列非常好的讲座链接可供学习。在Windows上,您需要确保CUDA在没有显示器的卡上运行,因为图形子系统具有看门狗计时器,会清除运行时间超过5秒的任何进程。这种情况不会在Linux上发生。
任何具有两个PCI-e x16插槽的机器都应该支持此功能。我使用了一台HP XW9300,你可以在eBay上以很便宜的价格购买。如果你这样做,请确保它有两个CPU(而不是一个双核CPU),因为PCI-e插槽位于单独的Hypertransport总线上,你需要两个CPU才能同时激活两个总线。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接