我是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
,观察到的速度增益似乎也很好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方法对速度增益的低估计使我认为我的分析有些不对劲,但我不确定是什么?
答案 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)
答案 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类
有一个工具clpeak尝试以编程方式衡量这些
将您的问题分类以衡量其性能和非常重要。选择合适的设备(了解其限制)
如果你比较intel-HD-4000&amp; i7-3630(在同一芯片上)https://github.com/krrishnarraj/clpeak/tree/master/results/Intel%28R%29_OpenCL