【问题标题】:OpenCL twice as slow as CUDA on GTX Titan [closed]OpenCL 在 GTX Titan 上的速度是 CUDA 的两倍 [关闭]
【发布时间】:2016-03-31 01:05:29
【问题描述】:

我有一个刚刚在 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 系列这样做吗?

【问题讨论】:

  • NVIDIA 在某些显卡上不会降低 OpenCL 的速度。
  • 这个方程的变量太多了。这里需要显示一些代码。需要给出正在使用的arrayfire和cuda的版本。
  • 还要从问题的末尾删除推测性问题。根据我们的经验,在其他条件相同的情况下,opencl 和 cuda 在 nvidia GPU(对于我们实现的内核)上的性能非常相似。差异来自 clBLAS 和 clFFT 等核心库,与 cuBLAS 和 cuFFT 不同,它们并未针对 NVIDIA GPUS 进行优化。
  • 也许就是这样,因为每一步都需要一个 fft 和一个逆 fft。
  • @chasep255 如果您不将问题更改为更少基于意见和更多技术性,我将不得不投票结束该问题。请从您的问题中删除任何基于意见的问题。

标签: cuda opencl nvidia arrayfire


【解决方案1】:

由于您没有显示任何代码,我只能提供一个分析器。例如,我正在使用 amd 的 codexl,所有图片均来自过度同步的卷积算法,该算法使用 50x50 的画笔区域在 768x768 矩阵上计算。最后有很多整数和本地整数数组和整数运算以及同样多的 fp 运算,会导致一些问题(工作在 3 个设备上平衡)。

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

  • 每个函数的 CPU 时间分析让您了解主机端的热点。此处列出的前 5 个最耗时的功能。因此您可以优化主机功能。(单击其中一项功能会显示每个核心的 cpu 指令的详细性能计数器)

  • 内核分析显示向量单元是否存在瓶颈, 标量单位、内存操作和更多选项。这里可以看到内核占用率和波前数,但右侧还有数十个其他内容。

当你点击kerneloccupancy cell时,你可以看到瓶颈的详细来源,如下图:

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

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

  • 增加执行规模,使 Titan 负载足以实现最佳性能(不是峰值)。

  • 当工作负载太小时,我的 R7-240(320 核)的性能优于我的 HD7870(1280 核),因为 r7 中的内核占用率更高,因为每个计算单元有更多的波前并且馈入 ALU %100(占用),也有更少的计算单元来准备计算(开销)和更少的硬件同步(开销)。这就是为什么有不同类别的基准,例如“性能”和“极限”。此外,较新的架构更接近其峰值性能。

  • 1234563 (如果您选择应用级并行性,而不是简单地增加每一步的工作量)。

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

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

【讨论】:

  • 我在步骤之间将数据留在了 gpu 上。我只渲染 20 到 50 步以最小化内存传输开销。另外我的网格大小为 1024x1024。根据 nvidia X-Server,我使用了 99% 的 titian。
  • 你从哪里获得他的应用程序的访问权限?
  • 来自 amd 的网站。开发者页面。计算与传输的比率也很重要。
  • @huseyintugrulbuyukisik 我的意思是 OP 的应用程序。重新阅读您的答案后,我意识到您描述了 something,但并不完全确定是什么。但是,您的回答很详细,但可能无法解决 OP 提出的问题。
  • @PavanYalamanchili 是的,我使用大量整数和局部整数数组对 768x768 矩阵上的 50x50 卷积进行了分析。它类似于获取一个区域的平均值并将其添加到下一次迭代的中心。它也是一种扩散算法,但不是光束。
猜你喜欢
  • 2015-07-08
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 2013-05-02
  • 2020-10-01
  • 2021-07-02
  • 1970-01-01
相关资源
最近更新 更多