17

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

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

4

5 回答 5

19

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

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

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

于 2011-10-28T17:04:28.947 回答
6

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

于 2011-12-04T10:24:09.113 回答
4

I've been using pyCUDA for a little while an I like prototyping with it because it speeds up the process of turning an idea into working code.

With pyCUDA you will be writing the CUDA kernels using C++, and it's CUDA, so there shouldn't be a difference in performance of running that code. But there will be a difference in the performance of the code you write in Python to setup or use the results of the pyCUDA kernel vs the one you write in C.

于 2011-10-28T19:18:00.300 回答
2

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

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

总而言之,测试和比较问题的两个方面并评估是否方便花时间编写 Cuda 脚本或获得可读性并支付较低性能的成本是一项很好的工作。

于 2021-04-21T06:47:14.650 回答
1

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

于 2016-09-15T00:59:42.963 回答