ECC2K-130在NVIDIA GPU上的实现与优化
1. 多项式乘法
在处理128个独立输入时,代码借助128个线程完成特定任务,即进行128次131位多项式的独立乘法运算。这些多项式以位切片形式存储为4 × 131个32位字,并且尽可能地运用128个并行的32位操作。
1.1 128位多项式乘法
首先从相对简单的128位多项式乘法开始,采用了三级Karatsuba展开。每一级展开使用2n个异或(XOR)操作将一个2n位乘法扩展为三个n位乘法,之后使用5n - 3个异或操作来收集结果(采用了Bernstein的“改进Karatsuba”方法)。
三级Karatsuba展开最终产生27个16位多项式乘法。这些乘法的输入总共占用864位,几乎耗尽了每个131位乘法可用的1024位共享内存,但并未完全用完。
将用于16位多项式乘法的代码进行调度,使其适配67个寄存器,并将其并行应用于这27个乘法运算中,在32个线程里有5个线程处于空闲状态。在27xmult16子例程中,108个线程执行来自四个独立131位多项式乘法的108个16位多项式乘法。每个线程执行413条指令(其中350条为位操作指令,63条为加载/存储指令),总共执行44604条指令。
与之对比,如果采用两级Karatsuba展开,会产生9个32位乘法。对于32位乘法器,最佳的寄存器分配需要161个寄存器,这就需要额外将数据溢出到共享内存。
初始展开操作很容易实现并行化,将其在所有三级展开中进行合并,每个操作数按16位块进行操作,每个线程使用8次加载、19次异或和27次存储操作。
收集结果则相对复杂。在最高级别(第3级)
超级会员免费看
订阅专栏 解锁全文
2084

被折叠的 条评论
为什么被折叠?



