【问题标题】:SHA1 hashing FPGA performanceSHA1 哈希 FPGA 性能
【发布时间】:2018-05-08 19:54:14
【问题描述】:

我正在尝试了解 FPGA 在 SHA1 散列方面的能力。

作为参考,SHA1 涉及执行一系列 32 位整数计算,按 80 个“步骤”排列;以下是算法中间的 4 个代表性步骤,用 C 语言:

x0 = rol(x13 ^ x8 ^ x2 ^ x0, 1);
e += rol(a,5) + (b^c^d) + x0 + 0x6ED9EBA1L;
b = rol(b,30); 

x1 = rol(x14 ^ x9 ^ x3 ^ x1, 1);
c += rol(d,5) + (e^a^b) + x1 + 0x6ED9EBA1L;
e = rol(e,30); 

x2 = rol(x13 ^ x10 ^ x4 ^ x2, 1);
b += rol(c,5) + (d^e^a) + x2 + 0x6ED9EBA1L;
d = rol(d,30); 

x3 = rol(x13 ^ x11 ^ x5 ^ x3, 1)
a += rol(b,5) + (c^d^e) + x3 + 0x6ED9EBA1L;
c = rol(c,30); 

共有 21 个内部 32 位变量,算法不断地将它们相互输入。 'rol' 是旋转移位(将位从一端移到另一端。)

现在,在我看来,计算 x13 ^ x11 ^ x5 ^ x3 需要 32 个 LUT,c^d^e 需要另外 32 个 LUT,我不清楚如何计算加法所需的资源,但我猜是 96 或 128 LUT。轮换和分配是通过互连完成的。所以,假设总共有 192 个 LUT,乘以 80 步,再加上一些开销。完全展开后,我预计约 16,000 个 LUT,每个时钟周期的吞吐量为 1 个输入块,延迟为 80 个时钟周期。 Xilinx Artix-7 XC7A50T 包含 8150 个切片,每个切片有 4 个 LUT,因此每个时钟周期的吞吐量为 2 个块,或 300 MHz 时为 600 Mhash/s(300 Gbps,因为每个块为 512 位。)这是合理的吗估计还是我走远了?

我找不到任何关于完全展开的 SHA1 实现的参考,但这些家伙 https://www.heliontech.com/fast_hash.htm 声称具有 828 个 LUT 和每 82 个时钟周期 1 个块的吞吐量的“非常高性能”实现,因此,更接近XC7A50T 上 70 Gbps。这个数字是不是因为没有展开就低很多?

【问题讨论】:

    标签: fpga


    【解决方案1】:

    现在,在我看来,计算 x13 ^ x11 ^ x5 ^ x3 需要 32 个 LUT,c^d^e 需要另外 32 个 LUT,我不清楚如何计算添加所需的资源,但我猜要么96 或 128 个 LUT。

    如果 XOR 和加法都是独立的,那一切都是正确的——但事实并非如此。 7 系列 FPGA 上的每个 LUT 最多可以占用 6 个输入,因此合成器可以将一些 XOR 吸收到加法链中。

    话虽如此,路由和布局将是您最大的障碍。为了使用进位链,宽加法器中的所有位都必须“垂直”布局。这会导致管道自然地从左向右流动,但我怀疑 XC7A50T 是否有足够的列来将整个管道容纳在一行中。路由资源将是限制因素,而不是 LUT。

    【讨论】:

    • XC7A100T呢?而且,切线,是否有任何具有超过 50K LC 且不花一分钱的开发板?我提到 50T 主要是因为我看到了一个 120 美元的 USB 接口板。 (实际上它是 XC7S50。)这个任务会更适合 Altera 或 Xilinx 吗?
    • 回复。 100T,我不确定。内部布局会有所不同,但我不确定它是否会以对此设计有用的方式有所不同。 7S50 与 7A50 不成问题;两条线非常相似。我对 Altera 设备不是特别熟悉,但我怀疑你会在那里遇到类似的问题。
    • 看起来我可以在工作中免费获得一个 Cyclone V 板 (301k LE),所以我将在那个上进行试验......谢谢你的帮助。
    【解决方案2】:

    好的,我现在可以回答我自己的问题了。我已经设法在 Verilog 中整合了一个有效的 SHA1 实现。

    https://github.com/ekuznetsov139/fpga

    这实际上是一个 WPA2 PMK 生成器,而不仅仅是 SHA1(SHA1 在同一数据上循环执行 8192 次。)

    我不会声称它是完美优化的,甚至没有特别好的编码 - 在过去的两周内,我已经了解了关于 Verilog 的所有知识,在其他项目之间,其中一半的时间都花在了整理数据上通过 PCI-Express 往返多个内核实例。但我让它在模拟器中正常工作,并在实际的 FPGA 上成功运行,性能数据接近我最初的预测。对于 Cyclone V 目标,我始终看到每个内核大约有 7,000 个 ALM,每个内核能够在每个时钟节拍执行一次哈希。一个 ALM 本质上是 2 个 LUT(1 个大或 2 个小)加上一些进位加法器硬件。所以,14,000 个 LUT。对于快速硅,Fmax 似乎在 300 MHz 左右,对于慢速硅,Fmax 似乎接近 150 MHz。

    我在最初的估计中没有考虑到的一件事是内部状态需要大量内存。 21 个 32 位变量乘以 80 步是 53760 位,并且每个 ALM 有 4 个寄存器,仅此一项就需要比所有计算更多的资源。但是编译器能够将大部分内容打包到内存单元中,即使我没有明确指示它这样做。

    不过,路由/布局是一个相当大的问题。我有一个 113K ALM (301K LE) 的芯片。我能装进去的最多是5份。利用率不到 40%。这需要大约 8 个小时的装配时间。打算试试 LogicLock 看看能不能做得更好。

    以 300 MHz 一次运行 5 个副本,吞吐量将为 1.5 Ghash/s SHA1 或 90 Khash/s WPA2。这比我希望的要少一些(大约是 GeForce 980 Ti 吞吐量的 1/3)。但至少能源效率要好得多。


    编辑:查看 Quartus 标准版中的 Design Partition Planner 即可发现问题。编译器太聪明了,它会合并每个内核的内部存储阵列,从而在内核之间创建大量不必要的互连。

    即使没有完整的 LogicLock,只要将“允许跨层次合并移位寄存器”设置为“关闭”,我就可以成功匹配 10 个副本。看看我能不能做到12...

    【讨论】:

      猜你喜欢
      • 2017-10-30
      • 1970-01-01
      • 2018-11-26
      • 2011-07-24
      • 2013-03-15
      • 2011-08-16
      • 1970-01-01
      • 2016-10-12
      • 2011-11-26
      相关资源
      最近更新 更多