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__
include
lammp
impl
mparam.h
生成于 2026年 五月 24日 星期日 18:55:00 , 为 LAMMP使用
1.9.8