OpenCL在GTX Titan上的速度是CUDA的两倍

时间:2016-03-31 01:05:29

标签: cuda opencl nvidia arrayfire

我有一个刚刚在ArrayFire中实现的光束传播算法。我在我的GTX Titan卡上使用OpenCL后端。使用OpenCL,它以每分钟约25,000步的速度运行。然后我将其切换到CUDA后端,性能上升到每分钟50,000步。这有点令人惊讶,但我认为它可能正在使用OpenCL中没有的一些更高级的功能。然后我使用我的GTX 960卡进行了相同的测试。它使用OpenCL以每分钟22,000步的速度运行,使用CUDA运行23,000步。这是令人困惑的,因为我预计它将遵循与泰坦相同的模式。另外我想我在使用GT 730M的笔记本电脑上看到了2倍的性能变化。我听说nvidia在某些卡片上放慢了OpenCL的速度。他们是否为700系列做到了这一点?

1 个答案:

答案 0 :(得分:3)

由于您没有显示任何代码,我只能提供一个分析器。例如,我使用amd的codexl,并且所有图片都是从过度同步的卷积算法中获得的,使用50x50计算的刷区域在768x768矩阵上。拥有大量的整数和本地整数数组以及整数运算和最后的fp操作,会导致一些问题(3台设备上的工作平衡)。

我确信nvidia有类似的软件可以检测应用程序中的漏洞。

  • 每个功能的CPU时间分析可让您了解主机端的热点。这里列出的5大最耗时的功能。因此,您可以优化主机功能。(单击其中一个功能会为每个内核带来cpu指令的详细性能计数器)

cpu time

  • 内核分析显示向量单元是否存在任何瓶颈, 标量单位,记忆操作和更多选项。这里可以看到内核占用率和波前数字,但右边还有数十种其他东西。

kernel analyzer

当您点击kerneloccupancy单元格时,您可以详细查看瓶颈来源,如下图所示:

enter image description here

  • 应用程序时间轴跟踪分析暴露了ndRangeKernel,读写操作,clFinish和其他API方法之间的差距,因此您可以查看是否存在冗余的sycnhronizations,多线程操作中的瓶颈和内存泄漏。(下图显示了垂直和内存中的漏洞)水平方向,因为此示例每个设备没有异步操作,并且存在冗余同步)

enter image description here

  • 另外一个gtx 960无法击败泰坦,除非工作量足够960并且足够小以适应泰坦(可能仅仅因为不同的设备处理引起的api开销)。它可能是每个单元具有192个核心的titan(每组384 - 768个线程更好)和每个单元具有128个核心的gtx960(每组256 - 512 -1024个线程具有更好的并行性)
  • 每分钟25000次迭代是每秒416次,每步约2.5毫秒。 2.5毫秒意味着您可以在此时间片上仅传输10-40 MB。发送的缓冲区大小是多少?过多的clFinish函数导致至少数百微秒,当内核时间相当时(例如1-2毫秒),可观察到延迟

  • 增加执行规模,以便加载足够的泰坦以达到最佳性能(非峰值)。

  • 当工作负载太小时,我的R7-240(320核心)优于我的HD7870(1280核心),因为r7中的内核占用率更高,因为每个计算单元有更多的波前,并且ALU被馈送%100(占用),也有较少的计算单元来准备计算(开销)和较少的硬件同步(开销)。这就是为什么基准测试有不同的类别,如“性能”和“极端”。更新的架构也更贴近他们的最佳表现。

  • 或许,gtx 960可能无法管理同时运行的3 x阵列激活应用程序(@ 15000 / m),而titan可能同时管理8-10个x应用程序(例如@ 15000 / m) (如果您选择应用级并行,而不是简单地增加每步的工作大小)。

编辑:示例代码实际上是计算类似扩散的交互。圆形源材料周围区域的平衡状态:

enter image description here

对于所有颜色通道,颜色条带来自将fp舍入到0-255整数范围(rgba-每个1字节,应该使用浮点数但不足以用于pci-e预算)