2011-04-20 31 views
14

偶然发现这个论坛主题dot product faster on cpu than on gpu using OpenCL,我再次被提醒,有些实例看起来像是为OpenCL *制作的,但是它们在何处使用,OpenCL并没有为我们提供增益。即我也有一个使用pyopencl代码的kmeans实现,它比简单的python代码快几倍,但仍然比kmeans的scipy函数快几倍。何时使用OpenCL?

那么你如何决定何时使用OpenCL?

  • 你需要什么显卡?显卡必须要比'cpu'好多少。 Quadro FX 580与i7 860足够吗?
  • 问题有多大?你需要数百万次的乘法才能获得某些东西或者有几百个足够的东西?
  • 为了让OpenCL有价值,需要对kmeans或dot产品等“简单”算法进行多少优化?

或者是这些三角形的情况下,你只能(/不得不)选择三个角落中的两个,使其工作?

problem size 
     /\ 
    /\ 
    / \ 
    / \ 
    /________\ 
GPU/CPU optimization 

我知道,我以前有点太大胆的语言,标题和问题的。如果我能想出更合适的措辞,我会改变它。

谢谢。像点积,k均值或矩阵乘法

回答

6

就像每个技术决策

*简单的矩阵运算,答案取决于要达到的目标。有关GPU的OpenCL功能的信息可以在供应商页面上找到。注意:并非所有GPU都支持OpenCL,并非所有支持OpenCL的GPU都支持双精度。您也可以考虑可能没有OpenCL环境的客户/客户端。

GPGPU编程(OpenCL和CUDA)适用于(几乎)所有类型的线性代数问题。这些问题很容易并行化,因此很容易在像GPU这样的并行环境中使用。 GPU上的所有问题都不需要太复杂和并行设计。这真的取决于你的问题领域。

另一方面,您需要关注OpenCL的一些收益。需要将一些数据从RAM复制到GPU并返回,这会导致一些延迟。您应该对CPU和GPU上的不同问题大小进行一些时间测量。你会很容易地看到何时达到收支平衡。我在CPU Opteron X64 2x2600和GPU Geforce 8600GTS上尝试了与ATLAS库的矩阵乘法。矩阵乘法只是两个维度为N×N的矩阵。破解平台的N大约在100左右。这个结果在很大程度上取决于所使用的CPU和GPU,在其他硬件上可能完全不同。

+1

添加到什么里克已经提到的,如果问题规模大足够的话,你将几乎总是在将计算交给GPU的过程中获得良好的性能。所以如果一个给定的函数在CPU上比较慢(与CPU相比),那么如果它是GPU上实现的更大代码的一部分,则仍然可以隐藏开销,而不必承担主机之间的传输头(MAIN )和设备(GPU)内存。 – 2011-04-21 23:34:27

7

答案的少数元素:

  • 点产品不是最适合操作以在GPU上运行,因为它本质上是一个减少,需要线程之间的同步。
  • 任何“最近”的GPU都可以:NVIDIA GTX 2xx,ATI/AMD HD5xxx或更高版本最适合OpenCL使用。将数据移入/移出GPU的速度很慢,在最佳情况下通常为6 GB/s。如果数据适合CPU高速缓存,那么除非任务的计算/ IO比例很大,否则CPU可能会更快。
  • 简单算法的高效代码可以在AMD/NVIDIA代码示例以及各种网站中找到。对于其他算法,找到正确的设计并优化代码可能需要一些时间。经过一段时间后,每种微架构的优化都是特定的,并且需要更多的时间。
+0

考虑具有百万或更多值的矩阵上的点积,并行化将大大提高性能,新数组中的每个单独值都不依赖于最后一个,因此每个输出可以单独完成,然后每个工作组可以并行化得更多通过平行乘法运算,然后将所有结果相加。没有必要真正同步,只要一切都完成了,没有任何操作取决于最后一步。 – 2018-02-14 20:03:42

1

GPU的全部都是关于密集计算发生的数据处理。您可以通过将计算密集型任务移植到GPU来卸载CPU。您收到的结果取决于您,因为GPU只是一个工具,它需要“正确”使用。

11

真正的关键应该是你的算法是否有很多固有的并行在那里你可以交出一个数据集并且有大量的并行处理发生在它上面。记住一个GPU可能有许多核心,但它们每个只有时钟.5-1GHZ。其优势在于处理大量的并行操作以获得极高的吞吐量。考虑吞吐量(数据计算*频率*流水线阶段) - 所以这将与频率的1/6进行权衡,使用其中一个GPU核心,但可能超过6 *核心数量(流水线阶段)。

当然还有的CPU <的额外开销 - > GPU屏障,也是你的算法可能导致多个GPU时钟周期来计算..