C功能速度最佳范围用于巨大周期



我正在使用A5/1的教学实现来玩耍,但我的功能的表现可怕:

#define R1MASK      0x07FFFF
#define R1TAPS      0x072000
bit parity(word x) { // XOR all bits
  x ^= x>>16;
  x ^= x>>8;
  x ^= x>>4;
  x ^= x>>2;
  x ^= x>>1;
  return x&1;
}
word clockone(word reg, word mask, word taps) { // clock one register
  word t = reg & taps;
  reg = (reg << 1) & mask;
  reg |= parity(t);
  return reg;
}
bit frameR1bit(word frame, int t) // Compute value of hat{f}_t^reg for chosen frame, chosen register, chosen many times
{
  bit framebit;
  R3 = 0;
  for (int i = 0; i < 22; i++) {
    clockone(R3, R3MASK, R3TAPS); /* clock with frame */
    framebit = (frame >> i) & 1; /* The i-th bit of the frame  */
    R3 ^= framebit;
  }
  for (int i = 0; i < t; i++)
    clockone(R3, R3MASK, R3TAPS); /* clock */
  return (parity(R3)); // Compute hat{f}_t^reg
} 

参数t在79和94之间,帧为228位,r3 is word(r3寄存器的内容),我可以预先计算我已加载在内存中的一切。问题是这些功能的大量计算。我在许多周期中使用函数 Framer1bit ,因此可以计算2^16 * 512 * 40 * 12次。整个程序真的很慢,我发现这是由于 Framer1bit 函数的这个周期所致。有人知道如何更好地实施此功能吗?我非常感谢任何帮助。

即使它并不清楚,在该循环中将clockoneparity的内容移动到您的frameR1bit功能中,也会为您带来一些周期。就目前而言,它正在设置并拆除parityclockonet堆栈帧。它不会是最大的节省,但是在机器级别上可以消除每次迭代中的16多个说明。

这可以通过使用-finline-functions可以为您自动实现,而无需修改代码。

最新更新