gpt4 book ai didi

c - 值得使用 mod 来替换循环索引的 if 语句

转载 作者:太空宇宙 更新时间:2023-11-04 05:52:15 24 4
gpt4 key购买 nike

我需要一个变量来指向数组索引,并且像 circle 一样在到达数组末尾时返回 0。我知道我可以使用 if 语句来判断,但我不确定使用 mod 来实现相同的功能是否会更快,谁能给我一些建议?

int p=0;
int arr[10];
void add_index(){
if(p==9) p=0;
else p++;
}

或者

int p=0;
int arr[10];
void add_index(){
p=(p+1)%10;
}

最佳答案

曾几何时,绝对是的。这些天,可能没有!

我将以 Intel Skylake 为例。 DIV 指令(产生商和余数,并用于此类操作)在 32 位被除数和除数上运行,具有 23 个周期的延迟和 6 个周期的倒数吞吐量。也就是说,根据它与其他操作的流水线方式,“成本”为 6-23 个周期。 (好吧,由于执行端口,它比那个复杂一点,但在这里和我一起工作。)正确预测的跳跃是 0.5-2 个周期,具体取决于它是否被采用,而错误预测的跳跃有 16 的惩罚-17 个周期。 (所有冰雹 Agner Fog 的时间。)

英特尔分支预测硬件真的非常好。期望它能够正确预测每九个分支将被采用可能太过分了,但在内部循环中我至少期望它能够正确预测其他 8 次。这意味着 if 语句的平均周期约为 3.5 个(不包括各种整数操作,它们添加可能 1-2 个周期)。哦,这是假设编译器特别 derpy 而不是像它应该的那样使用 CMOV。

要记住的是,整数除法是现代 CPU 可以执行的最慢的“正常”操作之一。但是,对于已知除数的模数,您可以改为使用特殊的加法/乘法/移位序列。因此,在上面的代码中,除数是编译时常量而不是从变量中获取的,您实际上可能会击败 DIV。这些序列可能很难流水线化,所以很难说它是否真的会赢。无论如何,现代编译器绝对知道这样的技巧。

底线:这很难说。如果您在内循环中大量 次执行该操作,实际上可能值得尝试这两种方式和时机。不过,您可能不会看到有意义的差异,也不会证明在其上花费优化时间是合理的。但是我经常写一些需要极高性能的代码,以前PPC默认是取模,现在x64默认是if/else。 (好吧,三元。)

关于c - 值得使用 mod 来替换循环索引的 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37676479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com