据我了解,有些问题可以高度并行化,例如渲染、视频解码。由于 CPU 在此类任务上表现不佳,因此创建了 GPU。它们使用不同的架构来执行 SIMD 执行。它们还具有一种特殊类型的内存,非常适合独立访问 GPU“线程”。
然而,我们看到 x86 架构获得了许多专注于流处理的扩展,例如 SSE 或 AVX。它们也是 SIMD,并且出于某种原因在 CPU 端运行。那么添加它们有什么意义呢?
这些扩展与常规 GPU 相比有什么优势?我的意思是 GPU 具有更高的内存带宽和其他功能,但这不会使带有扩展的 CPU 处于劣势吗?它们不会遇到内存带宽问题吗?
我知道并非每台计算机都应该有专用的 GPU,例如服务器或工作站。但如果有效载荷很小,这应该不是问题。如果有效载荷足够大,你会为该任务购买显卡。SIMD 扩展就像是 CPU 和 GPU 之间的中间地带。
如果 SIMD 扩展使 CPU 更有能力执行通常由 GPU 执行的任务,那么这是否会使 GPU 变得更加过时?我的意思是,如果他们可以使 CPU 更加支持 SIMD,为什么他们不首先这样做并决定将这个问题外包给其他设备?
我只是想知道这些扩展在性能至关重要的软件中会收到哪些应用程序。例如,游戏引擎或渲染器肯定会使用 GPU,SIMD 扩展会有什么不同吗?
答案1
仅仅因为你可以在 GPU 上做某事并不意味着在 GPU 上做这件事是最好的地方。
当您有大量数据需要执行相同操作时,GPU 的效果最佳。对于小批量数据,使用 CPU 代码内联运行可能更有效率。
GPU 的一个问题是,它需要 CPU 从某个地方获取数据,将其加载到 RAM 中,通过 PCIe 总线复制,在 GPU 上加载程序来处理数据,运行该程序,然后将结果复制回 CPU RAM。只有完成所有这些工作后,CPU 才能对数据进行处理。
如果您的 CPU 有一组针对此类操作的指令,并且不需要完成设置 GPU 的所有工作,那么您可能会发现对于少量数据,CPU 实际上更快。
当数据紧密依赖于 CPU 控制结构或数据寿命特别短暂时尤其如此。
如果 CPU 只需要 0.1 秒就能完成SHA 哈希使用 SSE 或 AVX,真的值得花 0.1 秒将数据发送到 GPU,再花 0.25 秒为该特定 GPU 编译着色器程序,然后等待数据返回吗?
当您饿了并且需要一些东西时,您会在线订购食物然后等待,还是直接从已经储备好的冰箱里拿东西?