gpgpu:如何根据gpu和cpu规范估算速度增益

时间:2014-05-29 14:01:46

标签: opencl gpgpu

我是gpgpu和opencl的完全初学者。我无法回答有关GPGPU的以下两个问题,

a)假设我有一段适合在gpu上运行的代码(对多个数据执行完全相同的指令集)。 假设我已经拥有了关于gpu的数据。有没有办法查看cpu和gpu的规格,并估计潜在的速度增益?例如,如果我在AMD R9 295X2 gpu(http://www.amd.com/en-us/products/graphics/desktop/r9/2..上运行了一段代码(在多个数据上运行完全相同的指令集),我如何估计速度增益(不包括将数据传输到gpu所需的时间) 。)而不是intel i7-4770K处理器(http://ark.intel.com/products/75123

b)有没有办法估算将数据传输到gpu所需的时间?

谢谢!


感谢您的回复!考虑到影响速度提升的大量因素,尝试和测试肯定是个好主意。但是,我确实对GFLOPS方法提出了一些问题,提到了一些回应;在发布问题之前,GFLOPS指标就是我所看到的。

我认为GFLOPS是估算SIMD类型操作潜在性能增益的好方法,因为它考虑了每个周期的时钟速度,内核和浮点运算的差异。但是,当我使用GFLOPS规范来处理数字时,似乎有些不正确。

好的:

基于GFLOPS的估计似乎与下面玩具内核观察到的速度增益相匹配。输入整数的内核" n"以蛮力的方式计算总和(1 + 2 + 3 + ... + n)。我觉得,下面的内核对于大整数有很多计算操作。我在gpu和cpu上运行内核从1000到60000的所有内容(顺序在cpu上,没有线程),并测量时间。

__ kernel void calculate(__ global int * input,__ global int * output){

size_t id=get_global_id(0);
int inp_num=input[id];
int si;
int sum;
sum=0;
for(int i=0;i<=inp_num;++i)
    sum+=i;

output[id]=sum; 

}

我的笔记本电脑上的GPU: NVS 5400M(www.nvidia.com/object/nvs_techspecs.html) GFLOPS,单精度:253.44(en.wikipedia.org/wiki/List_of_Nvidia_graphics_processing_units)

笔记本电脑上的CPU: intel i7-3720QM,2.6 GHz GFLOPS(假设单精度):83.2(download.intel.com/support/processors/corei7/sb/core_i7-3700_m.pdf)。英特尔文档未指定单引号还是双引号

CPU时间:3.295秒

GPU时间:0.184秒

每个核心的速度提升:3.295 / 0.184~18

使用全部4个核心的速度增益的理论估计:18 / 4~4.5

基于FLOPS的速度增益:(GPU FLOPS)/(CPU FLOPS)=(253.44 / 83.2)= 3.0

对于上面的示例,基于GLOPS的估计似乎与从实验中获得的估计一致,如果英特尔文档确实指定单个而非双精度的FLOPS。我确实试图在我的笔记本电脑上搜索更多关于英特尔处理器的触发器规范的链接。考虑到我有一个适度的GPU

,观察到的速度增益似乎也很好

问题:

在比较AMD的R9 295X2 gpu(www.amd.com/en-us/products/graphics/desktop/r9/295x2#)后,基于FLOPS的方法在考虑gpu价格之后似乎给出了远低于预期的速度增益。 )使用intels i7-4770K(ark.intel.com/products/75123):

AMDs FLOPS,单精度:11.5 TFLOPS(来自上述链接)

英特尔FLOPS,单精度:(核心数量)x(每核每循环FLOPS)x(时钟速度)=(4)x(32(峰值))(www.pcmag.com/article2/0,2817 ,2419798,00.asp))x(3.5)= 448 GFLOPS

基于FLOPS =(11.5 TFLOPS)/(448)~26

的速度增益

AMD GPU价格:1500美元

英特尔CPU价格:300美元

对于每个AMD R9 295X2 gpu,我可以购买5个intel i7-4770K cpu,这会将有效速度提升降低到(26/5)~5。但是,这个估计与100-200x完全一致,人们期望的速度会提高。 GFLOPS方法对速度增益的低估计使我认为我的分析有些不对劲,但我不确定是什么?

5 个答案:

答案 0 :(得分:0)

您需要检查内核。我自己正在学习CUDA,所以我无法准确地告诉你你对OpenCL的所作所为。

但我会大致了解一个内核单个实例将执行多少次浮点运算。然后找到每个设备每秒可以处理的浮点运算次数。

要启动的内核数量*(n内核的浮点运算/设备吞吐量(FLOPS))=执行时间

启动的内核数量取决于您的数据。

答案 1 :(得分:0)

A)通常这个问题永远不会回答。因为我们不是以1.05倍的速度发言。当问题适合时,问题是足以隐藏任何开销(100k WI),并且数据已经在GPU中,那么我们说的是100-300x的速度。通常没有人关心它是250x还是251x。

估算很难,因为平台完全不同。不仅包括时钟速度,还包括内存延迟和缓存,以及总线速度和处理元素。

我不能给你一个明确的答案,除了尝试和衡量。


B)复制内存的时间完全取决于GPU-CPU总线速度(PCI总线)。这就是硬件限制,实际上你的速度总是低于复制时的速度。通常,您可以应用三个规则来解决所需的时间,但总是有一个小的驱动程序开销,取决于平台和设备。因此,复制100个字节通常非常慢,但复制某些MB的速度与总线速度一样快。

创建GPGPU应用程序时,内存复制速度通常不是设计约束。由于它可以通过多种方式隐藏(固定内存等),因此,nodoby会注意到由于内存操作而导致的速度降低。


只要查看内存复制丢失的时间,就不应该对GPU问题是否合适做出任何决定。如果问题合适,可以采取更好的措施,如果你有足够的数据让GPU忙碌(否则直接用CPU做得更快)。

答案 2 :(得分:0)

  1. 潜在的速度增益很大程度上取决于算法实现。除非您正在开发非常简单的应用程序(如最简单的图像过滤器),否则很难预测性能水平。在某些情况下,可以使用内存系统性能作为基础进行估算,因为许多算法都是带宽限制的。
  2. 您可以通过将GPU内存带宽上的数据量除以设备内部操作来计算传输时间。查看硬件特性以获取它,或者计算您是否知道内存频率&amp;公交车宽度。对于主机 - 设备操作,PCI-E总线速度通常是限制。

答案 3 :(得分:0)

如果代码很容易(是gpu的轻量级内核需要)并且不依赖于内存,那么你可以接近:

 Sample kernel:
 Read two 32-bit floats from memory and 
 do calcs on them for 20-30 times at least. 
 Then write to memory once.

 New: GPU
 Old: CPU

 Gain ratio = ((New/Old) - 1 ) *100  (%)

 New= 5000 cores * 2 ALU-FPU per core * 1.0 GHz frequency = 10000 gflops

 Old = 10 cores * 8 ALU-FPU per core * 4.0GHz frequency = 320 gflops

 ((New/Old) - 1 ) *100 ===> 3000% speed gain.

 This  is when code uses registers and local memory mostly. Rarely hitting global mem.

如果代码很难(重分支+假的递归+非均匀性),只有3-5倍的速度增益。它可以等于或小于线性代码的CPU性能。

当代码依赖于内存时,它将是1TB / s(GPU)除以40GB / s(CPU)。

如果每次迭代都需要将数据上传到gpu,那么也会有pci-e带宽瓶颈。

答案 4 :(得分:0)

载荷通常分为2类

  1. 带宽限制 - 从全局内存中获取更多时间。即使增加cpu clock freq也无济于事。排序等问题。带宽容量使用GBPS
  2. 测量
  3. 计算边界 - 与cpu马力成正比。矩阵乘法等问题。使用GFLOPS
  4. 测量计算容量

    有一个工具clpeak尝试以编程方式衡量这些

    将您的问题分类以衡量其性能和非常重要。选择合适的设备(了解其限制)

    如果你比较intel-HD-4000&amp; i7-3630(在同一芯片上)https://github.com/krrishnarraj/clpeak/tree/master/results/Intel%28R%29_OpenCL

    1. i7带宽相对较好(加上没有转移开销)
    2. 就计算而言,gpu比i7快4-5倍