【发布时间】:2016-07-29 08:53:41
【问题描述】:
我在 CUDA 中开发了一个用于模幂运算的应用程序,它对 512 位整数的性能非常好。这种多精度整数存储在 16 个 32 位字中。
与 OpenSSL 模幂方法相比,我使用一些概念来实现 2.5 - 3.2 的加速:
-
__shared__内存 - CUDA 内存对齐
- 用于 32 位加法、乘法的 PTX 代码
- 展开
现在一切都很好,但是尝试将整数扩展到 1024 位,性能急剧下降到 0.1 - 0.3,唯一的区别是存储整数所需的内存大小 - 现在是 32 x 32 位字。更不用说慢数百倍的 2048 位版本了。
我不得不说,例如,当我想计算 1000 个模幂 (r = a^x mod n) 时,我只是将所有操作数发送到我的内核,这意味着 512000 字节的内存。
我的问题:为什么这个微小的变化会对性能产生如此大的影响?
我使用 Nvidia Geforce GT 520mx,Ubuntu 14.04 64 位。
【问题讨论】:
-
没有minimal reproducible example 很难/不可能说出来。您可能想要查看的一点是寄存器溢出。但这只是猜测......
-
注册溢出也是我的第一个猜测。使用 `nvcc -Xptxas=-v ...` 编译 PTX 以接收有关寄存器使用情况的信息,也许会有所帮助。
-
好的,我会考虑的!
标签: performance cuda