0

我需要确定 CUDA 和 CPU(i5 750)中(无符号)模乘的延迟和吞吐量。

对于 CPU,我找到了这篇文档,第 121 页,对于 Sandy Bridge,我不确定我应该参考哪一个,但是对于“MUL IMUL r32”,我得到 4 个周期的延迟和倒数吞吐量等于 2。然后“DIV r64”的延迟为 30-94 和 rec.thr。22-76。

最坏的情况是:

  • 延迟 94+4

  • rec.thr。76+2

正确的?虽然我使用 OpenSSL 来执行它们,但我很确定在最低级别它们总是运行简单的模乘法。

关于 CUDA,目前我在 PTX 中执行模乘:乘以 2 32b 数,将结果保存在 64b 寄存器上,在 64b 寄存器上加载 32b 模,然后执行 64b 模。

如果你看这里,第 76 页,他们说 Fermi 2.x 上 32b 整数乘法的吞吐量是 16(每个 MP 的每个时钟周期)。关于模数,他们只是说:“计算能力 2.x 的设备上的指令少于 20 条”......

这到底是什么意思?最坏的情况是每模每 MP 延迟 20 个周期?和吞吐量?每个 MP 有多少模数?

编辑:

如果我有一个扭曲,其中只有扭曲的前 16 个线程必须执行 32b 乘法(每个 MP 每个周期 16 个)。GPU 会忙一两个周期,尽管后半部分什么都不做?

4

1 回答 1

1

[由于您也在 NVIDIA 论坛http://devtalk.nvidia.com上提出了相同的问题,因此我只是将我在那里给出的答案复制到 StackOverflow。一般来说,当在多个平台上提出问题时,交叉引用很有帮助。]

对于像 GPU 这样的吞吐量架构,延迟是毫无意义的。确定您感兴趣的任何操作的吞吐量数字的最简单方法是在您计划定位的设备上对其进行测量。据我所知,这是为您引用的 CPU 文档生成表格的方式。

要检查机器代码,您可以使用 cuobjdump --dump-sass 反汇编模运算的机器代码 (SASS)。当我为 sm_20 执行此操作时,对于 32/32->32 位无符号模数,我总共计算了 16 条指令。从指令组合来看,我估计 Tesla C2050 在整个 GPU 上的吞吐量约为每秒 200 亿次操作(请注意,这是一个猜测,而不是测量的数字!)。

至于 64/64->64 位无符号模数,这是一个被调用的子程序,我最近在使用 CUDA 5.0 的 C2050 上测量了每秒 64 亿次操作的吞吐量。

您可能想研究 Montgomery 和 Barrett 的模乘算法,而不是使用除法。

于 2012-11-06T23:11:13.237 回答