【问题标题】:Why doesn't the Linux kernel use modulo for long?为什么 Linux 内核不长时间使用模数?
【发布时间】:2013-06-27 10:57:13
【问题描述】:

modulo functiontimespec normalization 中,内核代码通过循环计算模数,并阻止编译器将循环优化为模运算符。

为什么需要这样做?

我希望如果这种优化不好,编译器就不会那样做。除了,可能存在这种优化更快的架构。为什么所有架构都需要这段代码?

【问题讨论】:

    标签: c assembly linux-kernel


    【解决方案1】:

    如果程序员知道被除数只比除数大一点(因此迭代版本只会循环一次或两次),就会这样做。不能指望编译器解决这个问题。 div64.c 中的这条评论解释了这一点:

    /*
     * Iterative div/mod for use when dividend is not expected to be much
     * bigger than divisor.
     */
    

    您指向的模函数是iter_div_u64_rem(),在需要时显式使用;对于常规模数版本,有div_u64_rem()

    【讨论】:

    • 此外,在大多数 32 位体系结构上,对 64 位值使用 % 运算符需要来自 C 运行时库的辅助函数,而内核中没有这些函数。
    • @caf 那为什么 timespec 归一化函数使用它呢? Timespec 很大,可以很容易地除以少量。
    • @Chi-Lan:时间规范标准化总是将纳秒值除以固定值 1000000000。通常通过从另一个时间规范中减去一个时间规范或将两个时间规范相加来创建非规范化时间规范。这将使纳秒成员在 1 秒内处于正确范围内,因此除法/模循环可能只循环一次。
    猜你喜欢
    • 2017-04-08
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    相关资源
    最近更新 更多