【问题标题】:pyCUDA vs C performance differences?pyCUDA 与 C 的性能差异?
【发布时间】:2011-12-17 09:28:29
【问题描述】:

我是 CUDA 编程的新手,我想知道 pyCUDA 的性能与用纯 C 实现的程序相比如何。 性能会大致相同吗?有没有我应该注意的瓶颈?

编辑: 我显然试图先用谷歌搜索这个问题,但很惊讶没有找到任何信息。即我会排除 pyCUDA 人员在他们的常见问题解答中回答了这个问题。

【问题讨论】:

  • 寻找基准或编写自己的基准来进行比较是不可能的吗?似乎应该有一些带有相应CUDA-C程序的pyCUDA程序;为什么不运行它们,给它们计时,然后自己看看呢?此外,我发现 pyCUDA 人员的疏忽令人惊讶地疏忽了,至少在某种程度上没有详细讨论性能差异...... CUDA 用于性能,脚本语言比成熟的编程语言慢。即使 Python 在科学计算人中很流行,你也不能忽视 900 磅的性能。
  • 在我开始编写自己的基准测试之前,我真的很想听听有经验的人怎么说。就像我之前说的,我是 CUDA 的新手,所以我对什么是可能的和应该注意什么还没有很好的感觉。

标签: c cuda pycuda


【解决方案1】:

如果您使用 CUDA——无论是直接通过 C 还是使用 pyCUDA——您所做的所有繁重的数值工作都是在 gpu 上执行并用 CUDA C 编写的内核中完成的(直接由您,或间接与元素内核)。因此,在您的代码的这些部分中,性能应该没有真正的差异。

现在,如果您使用 pyCUDA,数组的初始化和任何后期分析都将在 python(可能使用 numpy)中完成,并且通常比直接在编译语言中执行要慢得多(尽管如果您已经以直接链接到高性能库的方式构建了 numpy/scipy,那么这些调用至少会在任何一种语言中执行相同的操作)。但希望您的初始化和完成工作只占您必须完成的总工作量的一小部分,这样即使有很大的开销,它仍然希望不会对整体运行时产生巨大影响。

事实上,如果计算的 python 部分确实会损害您的应用程序的性能,那么开始在 pyCUDA 中进行开发可能仍然是一种很好的入门方式,因为开发要容易得多,而且您可以总是在直接的 C 中重新实现那些在 Python 中太慢的代码部分,并从 python 中调用那些部分,从而获得两全其美。

【讨论】:

  • 启动内核的成本如何? PyCUDA 中的预期与纯 C 中的相同吗?
  • 可能内核启动速度较慢,因为必须解释/执行一行python。
  • 是的,是的。事实上,根据我的基准,它慢了一个数量级。在实际 GPU 处理速度非常快的情况下,迭代算法的性能受到很大影响。
  • ".. 所以你的代码的这些部分的性能应该没有真正的差异。" - - 没有意义。或者也许所有在 CPU 上完成的计算都应该是相同的速度,因为它是在 CPU 上完成的?在这个讨论中,我没有看到任何关于任何编译器优化的讨论。而且我还没有在世界任何地方找到任何提到使用 O3 或 O3 + FastMath 优化的 PyCUDA,或者有可能使用它们。就我尝试过的示例代码而言,它的编译速度太快了,以至于我无法相信它使用了具有最大优化的 nvcc。而且它们很重要。
  • @ÍhorMé :您可以使用在 documen.tician.de/pycuda/driver.html#module-pycuda.compiler 中讨论的选项设置编译器选项。
【解决方案2】:

如果您想知道以不同方式使用 pyCUDA 的性能差异,请参阅 pyCUDA Wiki 示例中包含的 SimpleSpeedTest.py。它对由封装在 pyCUDA 中的 CUDA C 内核以及由 pyCUDA 设计者创建的几个抽象完成的相同任务进行基准测试。存在性能差异。

【讨论】:

    【解决方案3】:

    我使用 pyCUDA 已经有一段时间了,我喜欢用它进行原型设计,因为它加快了将想法转化为工作代码的过程。

    使用 pyCUDA,您将使用 C++ 编写 CUDA 内核,它是 CUDA,因此运行该代码的性能应该没有差异。但是你用 Python 编写的代码来设置或使用 pyCUDA 内核的结果与你用 C 编写的代码的性能会有所不同。

    【讨论】:

      【解决方案4】:

      我一直在为这篇文章中的原始问题寻找答案,我发现问题比我想象的更深。

      根据我的经验,我比较了用 C 语言编写的 Cuda 内核和 CUFFT 与用 PyCuda 编写的。令人惊讶的是,我发现在我的计算机上,求和、乘法或进行 FFT 的性能因每个实现而异。例如,直到 2^23 个元素,我在向量大小的 cuFFT 中获得了几乎相同的性能。然而,对复数向量求和和相乘会带来一些麻烦。对于 N=2^17,在 C/Cuda 中获得的速度提升约为 6 倍,而在 PyCuda 中仅为 3 倍。它还取决于执行求和的方式。通过使用 SourceModule 并包装 Raw Cuda 代码,我发现我的内核对于 complex128 向量的 N (

      作为结论,测试和比较问题的两个方面并评估是否方便花时间编写 Cuda 脚本或获得可读性并支付较低性能的成本是否方便。

      【讨论】:

        【解决方案5】:

        如果您使用 PyCUDA 并且想要获得高性能,请确保您在那里使用 -O3 优化并使用 nvprof/nvvp 来分析您的内核。如果你想在 Python 中使用 Cuda,那么 PyCUDA 可能是不二之选。因为通过 Python 连接 C++/Cuda 代码简直就是地狱。你必须写很多丑陋的包装器。对于 numpy 集成,甚至需要更多的核心总结代码。

        【讨论】:

          猜你喜欢
          • 2023-04-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-03
          • 1970-01-01
          • 1970-01-01
          • 2019-11-15
          • 2020-10-15
          相关资源
          最近更新 更多