在并行位代码中实现快速计数器

| 我正在寻找一种优化的计数器实现,可能类似于格雷码,这将使我能够快速步进通过位片数组中的数字。 假设我有数组:
_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。     

要回复问题请先登录注册