确定CPU和CUDA上模块化乘法的延迟和吞吐量

时间:2012-11-06 12:53:41

标签: cuda multiplication modulo modular throughput

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

对于我找到的this document,第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模数。

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

究竟是什么意思?最差情况是每MP模数延迟每个模数20个周期?和吞吐量?每个MP有多少模数?

编辑:

如果我有一个warp,只有warp的前16个线程必须执行32b乘法(每个MP每个周期16个)。 GPU会忙一个或两个周期,虽然下半部分什么都不做?

1 个答案:

答案 0 :(得分:1)

[既然你在NVIDIA论坛上问了同样的问题,http://devtalk.nvidia.com,我只是把我给那里的答案复制到了StackOverflow。通常,在多个平台上提出问题时,交叉引用很有用。]

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

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

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

你可能想要研究Montgomery和Barrett的算法来进行模乘,而不是使用除法。