LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
mparam.h
浏览该文件的文档.
1/**
2 * Copyright (C) 2026 HJimmyK(Jericho Knox)
3 *
4 * This file is part of LAMMP.
5 *
6 * LAMMP is free software: you can redistribute it and/or modify it under
7 * the terms of the GNU Lesser General Public License (LGPL) as published
8 * by the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed WITHOUT ANY WARRANTY.
12 *
13 * See <https://www.gnu.org/licenses/>.
14 */
15
16#ifndef __LAMMP_MPARAM_H__
17#define __LAMMP_MPARAM_H__
18
19// 默认线程局部栈大小(不可变更),单位为字节
20#define LAMMP_DEFAULT_STACK_SIZE (320 * 1024)
21
22// 线程局部内存池大小(可以为0,表示不使用线程局部内存池),单位为字节
23#define LAMMP_POOL_SIZE (512 * 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 / 2)
90
91// 2x2矩阵乘法选择STRASSEN算法的阈值
92#define MAT22_MUL_STRASSEN_THRESHOLD 60
93
94// 2x2矩阵平方选择STRASSEN算法的阈值
95#define MAT22_SQR_STRASSEN_THRESHOLD 50
96
97// 幂运算中,底数长度为 1 的幂运算指数阈值,低于此阈值使用连乘法
98#define POW_1_EXP_THRESHOLD 10
99
100// 幂运算中,指数大于此值可能使用win2算法
101#define POW_WIN2_EXP_THRESHOLD 50
102
103// 幂运算中,底数长度大于此值可能使用win2算法
104#define POW_WIN2_N_THRESHOLD 400
105
106// 因子累乘中,因子数量低于此阈值则使用朴素连乘
107#define FACTORS_MUL_N_THRESHOLD 30
108
109// 排列数计算中,nPr直线分割阈值
110#define PERMUTATION_USHORT_K_THRESHOLD 18
111#define PERMUTATION_USHORT_B_THRESHOLD 21164
112#define PERMUTATION_UINT_K_THRESHOLD 136
113#define PERMUTATION_UINT_B_THRESHOLD 1659975
114
115// 排列数计算中,结果长度小于此阈值的将使用朴素算法
116#define BINOMIAL_RN_BASECASE_THRESHOLD 40
117// 元素累乘中,低于此长度的累乘将使用朴素算法
118#define ELEM_MUL_BASECASE_THRESHOLD 25
119
120// 使用梅森乘法计算高位的阈值
121#define MULHI_MERSENNE_THRESHOLD 477
122
123// 精确除法中,除数小于此阈值时使用朴素法
124#define DIVEXACT_BASECASE_THRESHOLD 50
125// 精确除法中,被除数小于此阈值时使用朴素法
126#define DIVEXACT_NN_THRESHOLD 350
127
128
129// cache 一次处理的位图数量
130#define PRIME_CACHE_BLOCK_NUM 64
131// cache 中质数最多可能的数量(取决于上面的PRIME_CACHE_BLOCK_NUM)
132#define PRIME_CACHE_SIZE 1028
133
134#define MP_UCHAR_MAX (0xff)
135#define MP_USHORT_MAX (0xffff)
136#define MP_UINT_MAX (0xffffffff)
137#define MP_ULONG_MAX (0xffffffffffffffffull)
138
139#define MP_CHAR_BITS (8)
140#define MP_SHORT_BITS (16)
141#define MP_INT_BITS (32)
142#define MP_LONG_BITS (64)
143
144#define MP_CHAR_BYTES (1)
145#define MP_SHORT_BYTES (2)
146#define MP_INT_BYTES (4)
147#define MP_LONG_BYTES (8)
148
149#define ODD_FACTORIAL_SIZE 25
150
151#define NPR_SHORT_LIMIT (0xffff)
152#define NPR_INT_LIMIT (0xffffffff)
153
154#define NCR_SHORT_LIMIT (0xffff)
155
156// B / 2
157#define LIMB_B_2 (0x8000000000000000ull)
158// B / 4
159#define LIMB_B_4 (0x4000000000000000ull)
160
161#endif // __LAMMP_MPARAM_H__