c-我如何调整代码,使其利用2013 Mac上的GPU



我有一台2013年的带有的Mac电脑

Processor: 2,7 GHz Quad-Core Intel Core i7 
Graphics: Intel HD Graphics 4000 1536 MB

如其";关于这台Mac"描述我想这意味着我的机器有一个GPU。现在,我正在使用一段看起来像泰勒展开图的代码:

double taylor(int n, double x) { 
double exp_sum = 1;     
for (int i = n - 1; i > 0; --i ) 
exp_sum = 1 + x * exp_sum / i;    
return exp_sum; 
}

我如何调整代码,使其利用这个GPU来加速我的计算?人们用CUDA做一些特殊的调整和汇编。但我想知道如何调整这个特殊GPU的代码和编译?

TL;DR:此代码很难并行化,尤其是在GPU上。即使可以并行化,与并行CPU实现相比,它在GPU上的速度也会较慢(为了DP精度(。


Intel HD Graphics 4000是一款支持OpenCL 1.2的集成图形处理单元(IGPU(。它支持简单精度和双精度。也就是说,双精度(DP(比大多数GPU上的简单精度(SP(慢得多(包括客户端AMD/Nvidia GPU,但不是一些为科学计算而制造的昂贵的服务器端GPU(。在实践中,它可以以256GFLOPS的速度对SP进行计算,64GFLOPS对DP进行计算。

您的处理器肯定是英特尔酷睿i7-3740QM。这个Ivy桥接处理器可以执行8个DP FLOP/周期和16个SP FLOP/循环。这意味着对于基频,DP中的4 * 2.7e9 * 8 = 86.4GFLOPS和SP中的4 * 2.7e9 * 16 = 172.8GFLOPS。在turbo中,这可以提高37%,但并非所有核心都可以处于最大turbo模式,而且不会持续很长时间(更不用说处理器温度会影响这一点(。假设所有核心都能达到最佳涡轮频率,则DP和SP分别意味着118.4和236.7 GFLOPS。

正如您所看到的,CPU可以比GPU更快地计算DP代码,因此GPU上的DP计算将明显较慢。这在PC上很常见(与计算服务器相反(。话虽如此,在GPU上的SP中计算速度可能会稍快(尽管在机器上为其编写GPU内核肯定不值得(。IGPU通常适用于卸载图形管道的一部分,这将是在CPU上进行的昂贵操作,如光栅化和纹理化。它们还可以很好地降低功耗,但不会因为速度而发光。

这实际上是一个更大的问题:循环有一个顺序依赖链,因此无法轻松并行(既不在CPU上,也不在大规模并行的GPU上(。更糟糕的是:计算受延迟限制,并受到慢速除法的速度限制(无论目标设备如何(。您可以预先计算反向值x / i,以使计算的延迟范围更小。这可以并行完成并矢量化(所以在CPU上肯定快8倍(。你可以使用OpenMP来做到这一点。话虽如此,代码仍将受到exp_sum = 1 + precomputed_factor[i] * exp_sum依赖链延迟的限制。如果可能的话,对这个泰勒级数使用另一个公式当然是个好主意:一个可以并行计算的公式。

最新更新