📜  Duff的装置如何运作?(1)

📅  最后修改于: 2023-12-03 15:14:48.895000             🧑  作者: Mango

Duff的装置是什么?

Duff的装置是一种循环展开技术,最初由Tom Duff在1983年发明。它是一种非常高效的技术,可以允许循环展开在大多数情况下实现最大的吞吐量。

函数样例

void duff_device(char *to, char *from, int count) {
  int n = (count + 7) / 8;
  switch (count % 8) {
    case 0: do { *to++ = *from++;
    case 7:      *to++ = *from++;
    case 6:      *to++ = *from++;
    case 5:      *to++ = *from++;
    case 4:      *to++ = *from++;
    case 3:      *to++ = *from++;
    case 2:      *to++ = *from++;
    case 1:      *to++ = *from++;
               } while (--n > 0);
  }
}

如何使用

上述代码中的 duff_device 函数可以向量化一个简单的内存复制。

给定两个指针 tofrom 以及要复制的字节大小 count,此功能将从地址为 from 开始的数据复制到从地址为 to 开始的存储中。然后,按字节向前移动从双方的偏移量开始,重复此过程,直到所有字节都复制为止。

如何运作

Duff的装置魔术在于 switch 语句中的奇怪行为。循环内的第一个操作会在循环开始时执行。然后,switch 语句会计算出未复制的字节数,然后确定循环将要进行的迭代数。

对于每个 case 代码块,计算机计划用 do-while 循环重复复制代码块。在这种情况下,循环重复的真正数量由变量 n 来控制,该变量朝向计数器为零的地方递减。循环展开的这部分允许计算机一次复制多个字节。在这种情况下,循环以重复复制代码块的方式启动,直到变量 n 减少到零。

总结

Duff's Device 是一种强大的技术,可以加速循环操作。正如我们所见,它使用了一些诡异的技巧来跳过循环的常规初始化。然后,它将要重复的循环的迭代数计算到位,以及用 C 代码展开循环的代码。由于循环展开是一种非常有效的代码,因此 Duff 的装置实际上可以减少循环的大约一半。