如何解决在并行位代码中实现快速计数器
| 我正在寻找一种优化的计数器实现,可能类似于格雷码,这将使我能够快速步进通过位片数组中的数字。 假设我有数组:_m256 header[640];
我需要继续更改计数器的位608-639。这256位中的每一个代表一个单独的并行计数器。
“递增”运算最多需要31个运算:对每个位置重复执行“与”运算以计算进位,对“异或”运算以计算值。
格雷码只需要xor,但我不知道计算索引的有效方法-它似乎需要多达31个操作才能确定位的位置。
理想情况下,我希望计数器需要少量的ALU操作来确定要更改的位。有人知道会有帮助吗?
解决方法
LRS可以使用少量XOR生成包含所有非零数字1..2 ^ n-1的序列,但会将每个阶段剩下的所有位移位。 http://www.ee.unb.ca/cgi-bin/tervo/sequence.pl?binary=11111中有一些信息。 XOR的数量取决于抽头的数量。只需单击几下,即可在http://www.newwaveinstruments.com/resources/articles/m_sequence_linear_feedback_shift_register_lfsr/32stages.txt上找到32位的LRS配置列表。当然,生成的序列是乱序的-它显然是随机的。
, 有趣的论文:格雷码。 (这是PDF)
PDF的第16页包含一种算法,用于查找要切换的位。在一般情况下,需要32次操作才能确定要更改的位。如果您可以从计数器中节省一位(这实际上使其成为31位计数器),则可以使平均递增时间花费较少的操作。
由于每当奇偶校验为偶数时都会切换低位,因此,如果您可以保留一个奇偶校验位,则每隔一个增量操作将只切换低位。而且,当然,您会在每次操作时都将奇偶校验位切换。
当奇偶校验为奇数时,您只需要执行算法部分即可找到要切换的位。但是,由于您已经知道奇偶校验是奇数,因此您不必检查所有内容。找到符合条件的钻头时可以停止。
我对SIMD不够熟悉,无法说是否有任何方法可以优化它。
就是说,我不清楚这是对“常规”二进制计数器将要执行的“最多31个操作”的改进。同样,一半的操作将只需要一次迭代。似乎使用格雷码的主要优点是只需要对存储器执行一次写操作(如果使用上述奇偶校验位方法,则需要两次写操作),而另一种方法可能需要对内存进行多达32次写操作。
, 您可以通过这种方式实现256个并行线性移位反馈寄存器(基数== 608)
calculate x := header[base+0] XOR header[base+1] XOR header[base+21] XOR header[base+31]
move all elements header[base]...header[base+30] to header[base+1]...header[base+31]
set header[base] := x
这将具有2 ^ 32-1个不同的状态。如果2 ^ 31-1足够,请使用抽头27和30代替0,1,21,31。魔幻数字来自http://www.xilinx.com/support/documentation/application_notes/xapp052.pdf。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。