我很想知道是否已将任何常用算法(排序,搜索,图形等)移植到OpenCL(或任何GPU语言),以及性能如何与CPU执行的相同算法进行比较。我对结果(数字)特别感兴趣。
谢谢!
答案 0 :(得分:9)
GPU是高度专业化的硬件,旨在很好地执行一小组任务并实现高度并行化。这基本上是算术运算(特别是单精度浮点运算,尽管较新的GPU在双精度下表现相当不错)。因此,它们仅适用于特定算法。我不确定排序是否符合该类别(至少在一般情况下)。
更常见的例子是金融工具的定价,大量矩阵数学甚至defeating encryption(蛮力)。话虽如此,我确实找到了Fast parallel GPU-sorting using a hybrid algorithm。
另一个常见引用的例子是running SETI@HOME on an Nvidia GPU,但它将苹果与橙子进行比较。与通常使用的CPU相比,GPU的工作单元是不同的(并且非常有限)。
答案 1 :(得分:5)
查看thrust:
Thrust是一个并行的CUDA库 带接口的算法 类似于C ++标准模板 图书馆(STL)。推力提供了一个 灵活的GPU高级接口 编程大大增强 开发人员的生产力。
答案 2 :(得分:5)
对于GPGPU所引用的任何性能数字,我们都很谨慎。很多人喜欢发布真正令人印象深刻的数字,这些数字没有考虑将输入数据从CPU输出到GPU和输出数据所需的传输时间,这两者都是PCIe的瓶颈。
答案 3 :(得分:3)
在NVidia的网站上有quite a few samples这类事情。请记住,排序等一些事情需要特殊的算法来实现高效的并行性,并且可能不如单核心上的非线程算法那么高效。
答案 4 :(得分:1)
图像大小调整必须在许多接受图片上传的网站上很常见。
调整2600ish x 2000ish 2MB jpeg图像(至512x512)的大小在C#中花费了23.5毫秒,具有绝对最低质量选项和最近邻采样。使用的函数是基于graphics.DrawImage()
的函数。 CPU使用率也是%21.5。
在C#端获取“rgba字节数组”并将其发送到GPU并在GPU中调整大小并将结果返回到映像中需要6.3毫秒,CPU使用率为12.7%。这是使用%55便宜的gpu完成的,仅有320个核心。
只有3.73倍的加速倍数。
此处的限制因素是,将提取的20MB rgb数据(jpeg仅为2MB!)发送到GPU。耗时的部分几乎占总时间的90%,包括C#侧字节数组提取!所以我猜想,如果提取部分也可以在GPU中完成,那么至少会有大约30倍的加速。
30倍并不差。然后,你可以使用调整大小层来管理提取层,以隐藏内存复制延迟,从而获得更快的速度!这可能是40X-50X。
然后提高采样质量(例如双三次而不是最近邻居),你在GPU方面更有优势。添加5x5高斯滤波器仅添加0.77毫希。 CPU会在此基础上获得更高的时间,特别是如果所需的高斯参数与C#.Net实现不同。
即使您对加速比率不满意,卸载到GPU并在CPU上拥有“免费核心”仍然有利于将更多工作推送到该服务器。
现在添加GPU功耗水平的事实(本例中为30W vs 125W),它更有利。
CPU很难赢得
C[i]=A[i]+B[i]
基准测试,当双方都运行优化代码时,您仍然可以将一半阵列卸载到GPU并同时使用CPU + GPU更快地完成。
GPU不是为非统一作品而构建的。 GPU具有较深的管道,因此在分档后由于分支而站起来需要太长时间。此外,SIMD类型硬件强制它在其上的所有工作项上做同样的事情。当工作项与组不同时,它会丢失跟踪并在整个SIMD管道中添加气泡,或者只是其他人等待同步点。因此,在完全混乱的条件下,分支会影响深度和宽度管道区域,并使其比CPU更慢。