我很想知道是否已将任何常用算法(排序,搜索,图形等)移植到OpenCL(或任何GPU语言),以及性能如何与CPU执行的相同算法进行比较。我对结果(数字)特别感兴趣。

谢谢!

有帮助吗?

解决方案

在NVidia的网站上有相当多的样本。请记住,排序等一些事情需要特殊的算法来实现高效的并行性,并且可能不如单核心上的非线程算法那样高效。

其他提示

GPU是高度专业化的硬件,旨在很好地执行一小组任务并实现高度并行化。这基本上是算术运算(特别是单精度浮点运算,尽管较新的GPU在双精度下表现相当不错)。因此,它们仅适用于特定算法。我不确定排序是否符合该类别(至少在一般情况下)。

更常见的例子是金融工具的定价,大量矩阵数学,甚至打败加密(通过暴力破解)。话虽这么说,我确实找到了使用混合算法进行快速并行GPU排序

另一个常见的例子是在Nvidia GPU上运行SETI @ HOME ,但它正在将苹果与桔子。与通常使用的CPU相比,GPU的工作单元是不同的(并且非常有限)。

查看 推力

  

Thrust是一个并行的CUDA库   带接口的算法   类似于C ++标准模板   图书馆(STL)。推力提供了一个   灵活的GPU高级接口   编程大大增强   开发人员的生产力。

对于GPGPU所引用的任何性能数字,我们都很谨慎。很多人喜欢发布真正令人印象深刻的数字,这些数字没有考虑将输入数据从CPU输出到GPU和输出数据所需的传输时间,这两者都是PCIe的瓶颈。

图像大小调整必须在许多接受图片上传的网站上很常见。

调整2600ish x 2000ish 2MB jpeg图像(至512x512)的大小在C#中花费了23.5毫秒,具有绝对最低质量选项和最近邻采样。使用的函数是基于 graphics.DrawImage()的函数。 CPU使用率也是%21.5。

获取“rgba字节数组”在C#端提取并将其发送到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更慢。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top