LAMMP 4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
mparam.h
浏览该文件的文档.
1/*
2 * [LAMMP]
3 * Copyright (C) [2025-2026] [HJimmyK(Jericho Knox)]
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 */
18
19#ifndef __LAMMP_MPARAM_H__
20#define __LAMMP_MPARAM_H__
21
22// 默认全局栈大小,单位为字节
23#define LAMMP_DEFAULT_STACK_SIZE 320 * 1024
24
25// 除法阈值:当操作数规模超过此值时,使用分治除法算法
26#define DIV_DIVIDE_THRESHOLD 50
27// 乘法逆元L阈值:用于选择乘法逆元计算策略的临界值
28#define DIV_MULINV_L_THRESHOLD 477
29// 乘法逆元N阈值:用于选择乘法逆元计算策略的临界值
30#define DIV_MULINV_N_THRESHOLD 1736
31
32// 牛顿迭代求逆阈值:超过此规模使用牛顿迭代法求逆
33#define INV_NEWTON_THRESHOLD 21
34// 梅森变换求逆阈值:超过此规模使用梅森变换法求逆
35#define INV_MODM_THRESHOLD 734
36
37// 梅森变换乘法逆元阈值:超过此规模选择梅森变换计算乘法逆元
38#define DIV_MULINV_MODM_THRESHOLD 477
39
40// 牛顿迭代开方阈值:超过此规模使用牛顿迭代法开方
41#define SQRT_NEWTON_THRESHOLD 50
42// 梅森变换开方阈值:超过此规模选择梅森变换计算
43#define SQRT_NEWTON_MODM_THRESHOLD 734
44
45// Toom-22乘法阈值:超过此规模使用Toom-22乘法
46#define MUL_TOOM22_THRESHOLD 20
47// Toom-X2乘法阈值:较短乘数小于此值使用Toom-X2不平衡乘法
48#define MUL_TOOMX2_THRESHOLD 30
49// Toom-33乘法阈值:超过此规模使用Toom-33乘法
50#define MUL_TOOM33_THRESHOLD 65
51// Toom-44乘法阈值:超过此规模使用Toom-44乘法
52#define MUL_TOOM44_THRESHOLD 581
53// FFT乘法阈值:超过此规模使用快速傅里叶变换(FFT)乘法
54#define MUL_FFT_THRESHOLD 2316
55
56// 低位乘法阈值:低于此规模使用朴素乘法
57#define MULLO_BASECASE_THRESHOLD 20
58// 低位除法阈值:低于此规模使用不平衡分治乘法
59#define MULLO_DC_THRESHOLD 11238
60
61// 精确逆元阈值:高于此规模使用牛顿迭代法
62#define BNINV_NEWTON_THRESHOLD 20
63
64// 费马变换阈值:低于此规模使用直接乘法而不再进行递归
65#define MUL_FFT_MODF_THRESHOLD 477
66
67// 转字符串除法阈值:字符串转换时选择除法算法的临界值
68#define TO_STR_DIVIDE_THRESHOLD 20
69// 转字符串基数幂阈值:字符串转换时基数幂计算的策略选择临界值
70#define TO_STR_BASEPOW_THRESHOLD 30
71// 从字符串解析除法阈值:字符串解析时选择除法算法的临界值
72#define FROM_STR_DIVIDE_THRESHOLD 45
73// 从字符串解析基数幂阈值:字符串解析时基数幂计算的策略选择临界值
74#define FROM_STR_BASEPOW_THRESHOLD 100
75
76// L1缓存大小,请将此值设置为实际单核CPU的L1缓存大小(字节数)
77// 8192 字节通常远远小于现代CPU的L1缓存大小,主要为分块缓存大小考虑
78#define L1_CACHE_SIZE 8192
79
80// L2缓存大小,请将此值设置为实际单核CPU的L2缓存大小(字节数)
81// 1Mb 字节是一个相对保守的数值
82#define L2_CACHE_SIZE (1ull << 20)
83
84#ifndef LIMB_BYTES
85#define LIMB_BYTES 8
86#endif
87
88// L1缓存分块大小
89#define PART_SIZE (L1_CACHE_SIZE / LIMB_BYTES / 4)
90
91// 元素连乘朴素连乘空间长度
92#define LIMB_ELEMMUL_MP_THRESHOLD 20
93
94// 向量连乘朴素连乘空间长度
95#define VEC_ELEMMUL_MP_THRESHOLD 40
96
97// 2x2矩阵乘法选择STRASSEN算法的阈值
98#define MAT22_MUL_STRASSEN_THRESHOLD 60
99
100// 2x2矩阵平方选择STRASSEN算法的阈值
101#define MAT22_SQR_STRASSEN_THRESHOLD 50
102
103// 幂运算中,底数长度为 1 的幂运算指数阈值,低于此阈值使用连乘法
104#define POW_1_EXP_THRESHOLD 10
105
106// 幂运算中,指数大于此值可能使用win2算法
107#define POW_WIN2_EXP_THRESHOLD 50
108
109// 幂运算中,底数长度大于此值可能使用win2算法
110#define POW_WIN2_N_THRESHOLD 400
111
112// 排列数计算中,结果长度小于此阈值的将使用累乘
113#define PERMUTATION_USHORT_MUL_THRESHOLD 1120
114
115// 排列数计算中,结果长度小于此阈值的将使用累乘
116#define PERMUTATION_UINT_MUL_THRESHOLD 3200
117
118// 排列数计算中,n与r相差的倍数阈值,相差倍数大于此值,使用累乘
119#define PERMUTATION_USHORT_TIMES_THRESHOLD 8
120
121// 排列数计算中,n与r相差的倍数阈值,相差倍数大于此值,使用累乘
122#define PERMUTATION_UINT_TIMES_THRESHOLD 13
123
124// 排列数计算中,结果长度小于此阈值的将使用朴素算法
125#define BINOMIAL_RN_BASECASE_THRESHOLD 30
126// 元素累乘中,低于此长度的累乘将使用朴素算法
127#define ELEM_MUL_BASECASE_THRESHOLD 20
128
129// binvert计算中,使用梅森乘法计算高位的阈值
130#define BINVERT_MULHI_MERSENNE_THRESHOLD 477
131
132// cache 一次处理的位图数量
133#define PRIME_CACHE_BLOCK_NUM 32
134// 一个位图中质数最多的数量(实际为31)
135#define PRIME_CACHE_BLOCK_SIZE 32
136
137#define MP_UCHAR_MAX (0xff)
138#define MP_USHORT_MAX (0xffff)
139#define MP_UINT_MAX (0xffffffff)
140#define MP_ULONG_MAX (0xffffffffffffffffull)
141
142#define MP_CHAR_BITS (8)
143#define MP_SHORT_BITS (16)
144#define MP_INT_BITS (32)
145#define MP_LONG_BITS (64)
146
147#define MP_CHAR_BYTES (1)
148#define MP_SHORT_BYTES (2)
149#define MP_INT_BYTES (4)
150#define MP_LONG_BYTES (8)
151
152#define ODD_FACTORIAL_SIZE 25
153
154#define NPR_SHORT_LIMIT (0xffff)
155#define NPR_INT_LIMIT (0xffffffff)
156
157#define NCR_SHORT_LIMIT (0xffff)
158
159// B / 2
160#define LIMB_B_2 (0x8000000000000000ull)
161// B / 4
162#define LIMB_B_4 (0x4000000000000000ull)
163
164// log(2) 的数值
165#define LOG2_ 0.693147180559945
166
167// 2^53,为避免浮点数精度问题,大于此值某些浮点数缓冲区计算可能产生错误
168#define DBL_2POW_MANT_DIG_ 0x20000000000000ull
169
170#endif // __LAMMP_MPARAM_H__