libdivide 的官方 git 仓库:优化的整数除法
libdivide libdivide.h 是一个仅包含头文件的 C/C++ 库,用于优化整数除法。整数除法是大多数 CPU 上最慢的指令之一,例如,在当前的 x64 CPU 上,64 位整数除法的延迟可达 90 个时钟周期,而乘法的延迟仅为 3 个时钟周期。libdivide 允许您用一系列移位、加法和乘法指令来代替昂贵的整数除法指令,从而更快地计算整数除法。使用 libdivide 时,在当前 CPU 上,64 位整数除法的速度可提高 10 倍,32 位整数除法的速度可提高 5 倍。libdivide 还支持 SSE2、AVX2、AVX512、NEON 和 SVE 向量除法,这些功能可提供更大的速度提升。您可以使用基准程序测试在您的 CPU 上可以实现多少速度提升。libdivide 与 8 位微控制器兼容,例如 AVR 系列:CI 版本包含一个 AtMega2560 目标。由于低端硬件通常不包含硬件除法器,因此 libdivide 特别有用。除了运行时 C 和 C++ API,还包含一组预定义的宏和模板,用于加速对 16 位常数的除法:在 8 位系统上,avr-gcc 不会对 16 位常数的除法进行优化。有关 libdivide 的更多信息,请参阅 https://libdivide.com。C++ 示例 第一段代码使用整数除法对向量中的所有整数进行除法。由于整数除法比当前 CPU 上的任何其他整数算术运算慢至少一个数量级,因此速度很慢。C++ void divide(std::vector& vect, int64t divisor) { // 速度慢,使用整数除法 for (auto& n : vect) n /= divisor; } 第二段代码运行速度更快,它使用 libdivide 来使用移位、加法和乘法指令计算整数除法,从而避免了缓慢的整数除法操作。C++ #include "libdivide.h" void divide(std::vector& vect, int64t divisor) { libdivide::divider fastd(divisor); // 速度快,使用 libdivide 来计算除法 for (auto& n : vect) n /= fastd; } 通常情况下,如果以下情况成立,libdivide 将带来显著的速度提升: 除数仅在运行时才知道 除数可重用…
暂无开放 Issues,或尚未同步最近议题。