C周期的C函数速度最优化

时间:2015-05-11 11:23:56

标签: c performance encryption

我正在和A5 / 1的pedagogical implementation玩耍,但我遭遇了很少功能的糟糕表现:

#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是字(R3寄存器的内容),我可以预先计算的所有内容都已加载到内存中。 问题是这些功能的大量计算。我在很多周期内使用函数 frameR1bit ,因此计算2 ^ 16 * 512 * 40 * 12次。整个程序非常慢,我发现这是由于 frameR1bit 函数的循环。有谁知道如何更好地实现这些功能?我真的很感激任何帮助。

1 个答案:

答案 0 :(得分:0)

即使它不是那么清楚,将clockoneparity的内容移动到该循环中的frameR1bit函数中会让你回到某个周期。目前正在设置和拆除tparity的{​​{1}}堆栈框架。它不会成为最大的节省,但在机器级别上,每次迭代将消除超过16条指令。

这可以通过使用clockone来自动完成,而无需修改代码。