📅  最后修改于: 2023-12-03 15:14:48.895000             🧑  作者: Mango
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
函数可以向量化一个简单的内存复制。
给定两个指针 to
和 from
以及要复制的字节大小 count
,此功能将从地址为 from
开始的数据复制到从地址为 to
开始的存储中。然后,按字节向前移动从双方的偏移量开始,重复此过程,直到所有字节都复制为止。
Duff的装置魔术在于 switch
语句中的奇怪行为。循环内的第一个操作会在循环开始时执行。然后,switch
语句会计算出未复制的字节数,然后确定循环将要进行的迭代数。
对于每个 case
代码块,计算机计划用 do-while
循环重复复制代码块。在这种情况下,循环重复的真正数量由变量 n
来控制,该变量朝向计数器为零的地方递减。循环展开的这部分允许计算机一次复制多个字节。在这种情况下,循环以重复复制代码块的方式启动,直到变量 n
减少到零。
Duff's Device 是一种强大的技术,可以加速循环操作。正如我们所见,它使用了一些诡异的技巧来跳过循环的常规初始化。然后,它将要重复的循环的迭代数计算到位,以及用 C 代码展开循环的代码。由于循环展开是一种非常有效的代码,因此 Duff 的装置实际上可以减少循环的大约一半。