【发布时间】:2021-09-29 05:47:46
【问题描述】:
我需要构建一个低延迟、单周期的硬件模块来查找数组中最大元素的索引和值。目前,我正在使用比较器树,但延迟不令人满意。那么是否还有其他可能具有更低延迟的算法?
我希望输入数组很大(256 到 4096 个元素)并且值很小(3 到 5 位)。另外,我希望数组是稀疏的,即许多小值和少数大值。
我主要关心的是延迟;区域并不那么重要。
我当前使用比较器树的实现如下所示:
implicit class reduceTreeOp[A](seq: Seq[A]) {
def reduceTree[B >: A](op: (B, B) => B): B = {
if(seq.length == 0)
throw new NoSuchElementException("cannot reduce empty Seq")
var rseq: Seq[B] = seq
while(rseq.length != 1)
rseq = rseq.grouped(2).toSeq
.map(s => if(s.length == 1) s(0) else op(s(0), s(1)))
rseq(0)
}
}
val (value, index) = array
.zipWithIndex
.map{case (v, i) => (v, i.U)}
.reduceTree[(UInt, UInt)]{case ((val1, idx1), (val2, idx2)) =>
val is1 = val1 >= idx2
( Mux(is1, val1, idx2),
Mux(is1, idx1, idx2))
}
FWIW 这是为 7nm 硬件设计的;虽然我怀疑这对我的问题是否真的很重要。
【问题讨论】:
标签: max hardware chisel low-latency