LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
mat22_mul.h 文件参考
#include "../lmmp.h"
+ mat22_mul.h 的引用(Include)关系图:
+ 此图展示该文件直接或间接的被哪些文件引用了:

浏览源代码.

结构体

struct  lmmp_mat22_t
 

宏定义

#define INLINE_   static inline
 Copyright (C) 2026 HJimmyK(Jericho Knox)
 

函数

static void lmmp_mat22_mul_ (lmmp_mat22_t *dst, const lmmp_mat22_t *matA, const lmmp_mat22_t *matB, int choose, mp_size_t tn, mp_size_t maxa)
 计算2x2矩阵和2x2矩阵的乘积
 
void lmmp_mat22_mul_basecase_ (lmmp_mat22_t *dst, const lmmp_mat22_t *matA, const lmmp_mat22_t *matB, mp_ptr tp, mp_size_t tn)
 计算2x2矩阵和2x2矩阵的乘积
 
int lmmp_mat22_mul_size_ (lmmp_mat22_t *dst, const lmmp_mat22_t *matA, const lmmp_mat22_t *matB, mp_size_t *tn, mp_size_t *maxa)
 计算2x2矩阵和2x2矩阵的乘积需要分配的内存
 
void lmmp_mat22_mul_strassen_ (lmmp_mat22_t *dst, const lmmp_mat22_t *matA, const lmmp_mat22_t *matB, mp_ptr tp, mp_size_t tn, mp_size_t maxa)
 计算(稠密)2x2矩阵和(稠密)2x2矩阵的乘积(STRASSEN算法)
 
static void lmmp_mat22_sqr_ (lmmp_mat22_t *dst, const lmmp_mat22_t *mat, int choose, mp_size_t tn)
 计算(稠密)2x2矩阵平方
 
void lmmp_mat22_sqr_basecase_ (lmmp_mat22_t *dst, const lmmp_mat22_t *matA, mp_ptr tp, mp_size_t tn)
 计算2x2矩阵平方
 
void lmmp_mat22_sqr_strassen_ (lmmp_mat22_t *dst, const lmmp_mat22_t *matA, mp_ptr tp, mp_size_t tn)
 计算(稠密)2x2矩阵平方(STRASSEN算法)
 

结构体说明

◆ lmmp_mat22_t

struct lmmp_mat22_t

在文件 mat22_mul.h26 行定义.

+ lmmp_mat22_t 的协作图:
成员变量
mp_ptr a00
mp_ptr a01
mp_ptr a10
mp_ptr a11
mp_ssize_t n00
mp_ssize_t n01
mp_ssize_t n10
mp_ssize_t n11

宏定义说明

◆ INLINE_

#define INLINE_   static inline

Copyright (C) 2026 HJimmyK(Jericho Knox)

This file is part of LAMMP.

LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This program is distributed WITHOUT ANY WARRANTY.

See https://www.gnu.org/licenses/.

在文件 mat22_mul.h23 行定义.

函数说明

◆ lmmp_mat22_mul_()

static void lmmp_mat22_mul_ ( lmmp_mat22_t dst,
const lmmp_mat22_t matA,
const lmmp_mat22_t matB,
int  choose,
mp_size_t  tn,
mp_size_t  maxa 
)
inlinestatic

计算2x2矩阵和2x2矩阵的乘积

参数
dst结果矩阵。
matA矩阵A
matB矩阵B
choose选择算法,0表示basecase算法,1表示STRASSEN算法
tn缓冲区的limb长度,建议由lmmp_mat22_mul_size_确定
maxamatA中最大的元素的limb长度+1,建议由lmmp_mat22_mul_size_确定
警告
dst!=NULL, nonull(dst), [matA|matB]!=NULL, nonull([matA|matB]), sep(dst,[matA|matB]), choose==[0|1]

在文件 mat22_mul.h107 行定义.

108 {
112 lmmp_param_assert(choose == 0 || choose == 1);
113 if (choose == 0) {
115 } else {
117 }
118}
#define lmmp_param_assert(x)
Definition lmmp.h:401
void lmmp_mat22_mul_strassen_(lmmp_mat22_t *dst, const lmmp_mat22_t *matA, const lmmp_mat22_t *matB, mp_ptr tp, mp_size_t tn, mp_size_t maxa)
计算(稠密)2x2矩阵和(稠密)2x2矩阵的乘积(STRASSEN算法)
Definition mat22_mul.c:204
void lmmp_mat22_mul_basecase_(lmmp_mat22_t *dst, const lmmp_mat22_t *matA, const lmmp_mat22_t *matB, mp_ptr tp, mp_size_t tn)
计算2x2矩阵和2x2矩阵的乘积
Definition mat22_mul.c:93
#define n

引用了 lmmp_mat22_mul_basecase_(), lmmp_mat22_mul_strassen_() , 以及 lmmp_param_assert.

+ 函数调用图:

◆ lmmp_mat22_mul_basecase_()

void lmmp_mat22_mul_basecase_ ( lmmp_mat22_t dst,
const lmmp_mat22_t matA,
const lmmp_mat22_t matB,
mp_ptr  tp,
mp_size_t  tn 
)

计算2x2矩阵和2x2矩阵的乘积

参数
dst结果矩阵。
matA矩阵A
matB矩阵B
tp临时缓冲区,用于存储中间结果,需要分配2*tn个limb,若为NULL,则会自动分配。
tn缓冲区的limb长度
警告
dst!=NULL, nonull(dst), [matA|matB]!=NULL, nonull([matA|matB]), sep(dst,[matA|matB]), tn>0

在文件 mat22_mul.c93 行定义.

99 {
100 lmmp_param_assert(matA != NULL && matB != NULL && dst != NULL);
101 lmmp_param_assert(tn > 0);
102 if (matA == matB) {
104 return;
105 }
106 TEMP_DECL;
107 if (tp == NULL)
108 tp = TALLOC_TYPE(tn * 2, mp_limb_t);
109#define p1 tp
110#define p2 tp + tn
112 pn1 = lmmp_mul_signed_(p1, matA->a00, matA->n00, matB->a00, matB->n00);
113 pn2 = lmmp_mul_signed_(p2, matA->a01, matA->n01, matB->a10, matB->n10);
114 dst->n00 = lmmp_add_signed_(dst->a00, p1, pn1, p2, pn2);
115 pn1 = lmmp_mul_signed_(p1, matA->a00, matA->n00, matB->a01, matB->n01);
116 pn2 = lmmp_mul_signed_(p2, matA->a01, matA->n01, matB->a11, matB->n11);
117 dst->n01 = lmmp_add_signed_(dst->a01, p1, pn1, p2, pn2);
118 pn1 = lmmp_mul_signed_(p1, matA->a10, matA->n10, matB->a00, matB->n00);
119 pn2 = lmmp_mul_signed_(p2, matA->a11, matA->n11, matB->a10, matB->n10);
120 dst->n10 = lmmp_add_signed_(dst->a10, p1, pn1, p2, pn2);
121 pn1 = lmmp_mul_signed_(p1, matA->a10, matA->n10, matB->a01, matB->n01);
122 pn2 = lmmp_mul_signed_(p2, matA->a11, matA->n11, matB->a11, matB->n11);
123 dst->n11 = lmmp_add_signed_(dst->a11, p1, pn1, p2, pn2);
124#undef p1
125#undef p2
126 TEMP_FREE;
127}
int64_t mp_ssize_t
Definition lmmp.h:79
uint64_t mp_limb_t
Definition lmmp.h:76
#define p2
void lmmp_mat22_sqr_basecase_(lmmp_mat22_t *dst, const lmmp_mat22_t *matA, mp_ptr tp, mp_size_t tn)
计算2x2矩阵平方
Definition mat22_mul.c:129
#define p1
#define tp
static mp_ssize_t lmmp_add_signed_(mp_ptr dst, mp_srcptr numa, mp_ssize_t na, mp_srcptr numb, mp_ssize_t nb)
计算带符号数的加法
Definition signed.h:35
static mp_ssize_t lmmp_mul_signed_(mp_ptr dst, mp_srcptr numa, mp_ssize_t na, mp_srcptr numb, mp_ssize_t nb)
计算带符号数的乘法
Definition signed.h:143
#define TEMP_DECL
Definition tmp_alloc.h:131
#define TEMP_FREE
Definition tmp_alloc.h:150
#define TALLOC_TYPE(n, type)
Definition tmp_alloc.h:148

引用了 lmmp_add_signed_(), lmmp_mat22_sqr_basecase_(), lmmp_mul_signed_(), lmmp_param_assert, n, p1, p2, TALLOC_TYPE, TEMP_DECL, TEMP_FREE , 以及 tp.

被这些函数引用 lmmp_mat22_mul_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ lmmp_mat22_mul_size_()

int lmmp_mat22_mul_size_ ( lmmp_mat22_t dst,
const lmmp_mat22_t matA,
const lmmp_mat22_t matB,
mp_size_t tn,
mp_size_t maxa 
)

计算2x2矩阵和2x2矩阵的乘积需要分配的内存

参数
dst结果矩阵,dst中的n将会被覆盖为对应位置需要的limb长度,此函数不分配内存。
matA矩阵A
matB矩阵B
tn输出参数,将会被覆盖为缓冲区需要的limb长度,正数
maxa如果被覆盖,即matA中最大的元素的limb长度+1,此参数只有当确认使用STRASSEN算法时才需要
警告
dst!=NULL, [matA|matB]!=NULL, nonull([matA|matB]), sep(dst,[matA|matB]), tn!=NULL, maxa!=NULL
注解
如果你可以确认一定不使用STRASSEN算法,则不需要maxa参数,其可以为NULL。
返回
0表示选择basecase算法,1表示选择STRASSEN算法。

计算2x2矩阵和2x2矩阵的乘积需要分配的内存

This file is part of LAMMP.

LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This program is distributed WITHOUT ANY WARRANTY.

See https://www.gnu.org/licenses/.

在文件 mat22_mul.c23 行定义.

29 {
32 if (matA == matB) {
39 dst->n00 = LMMP_MAX((A00 + A00), (A01 + A10));
40 dst->n01 = LMMP_MAX((A00 + A01), (A01 + A11));
41 dst->n10 = LMMP_MAX((A10 + A00), (A11 + A10));
42 dst->n11 = LMMP_MAX((A10 + A01), (A11 + A11));
43 *tn = LMMP_MAX(LMMP_MAX(LMMP_MAX(dst->n00, dst->n01), dst->n10), dst->n11) + 1;
44 ++(dst->n00);
45 ++(dst->n01);
46 ++(dst->n10);
47 ++(dst->n11);
48 return 0;
49 } else {
51 *tn = (*maxa << 1) + 1;
52 dst->n00 = *tn;
53 dst->n01 = *tn;
54 dst->n10 = *tn;
55 dst->n11 = *tn;
56 return 1;
57 }
58 } else {
71 dst->n00 = LMMP_MAX((A00 + B00), (A01 + B10));
72 dst->n01 = LMMP_MAX((A00 + B01), (A01 + B11));
73 dst->n10 = LMMP_MAX((A10 + B00), (A11 + B10));
74 dst->n11 = LMMP_MAX((A10 + B01), (A11 + B11));
75 *tn = LMMP_MAX(LMMP_MAX(LMMP_MAX(dst->n00, dst->n01), dst->n10), dst->n11);
76 ++(dst->n00);
77 ++(dst->n01);
78 ++(dst->n10);
79 ++(dst->n11);
80 return 0;
81 } else {
83 *tn = *maxa + LMMP_MAX(LMMP_MAX(LMMP_MAX(B00, B01), B10), B11) + 1;
84 dst->n00 = *tn;
85 dst->n01 = *tn;
86 dst->n10 = *tn;
87 dst->n11 = *tn;
88 return 1;
89 }
90 }
91}
#define LMMP_MAX(h, i)
Definition lmmp.h:353
#define LMMP_ABS(x)
Definition lmmp.h:349
#define A11
#define B11
#define MAT22_SQR_STRASSEN_THRESHOLD
Definition mparam.h:95
#define MAT22_MUL_STRASSEN_THRESHOLD
Definition mparam.h:92

引用了 A11, B11, LMMP_ABS, LMMP_MAX, lmmp_param_assert, MAT22_MUL_STRASSEN_THRESHOLD, MAT22_SQR_STRASSEN_THRESHOLD , 以及 n.

◆ lmmp_mat22_mul_strassen_()

void lmmp_mat22_mul_strassen_ ( lmmp_mat22_t dst,
const lmmp_mat22_t matA,
const lmmp_mat22_t matB,
mp_ptr  tp,
mp_size_t  tn,
mp_size_t  maxa 
)

计算(稠密)2x2矩阵和(稠密)2x2矩阵的乘积(STRASSEN算法)

参数
dst结果矩阵。
matA矩阵A
matB矩阵B
tp临时缓冲区,用于存储中间结果,需要分配7*(tn+1)个limb,若为NULL,则会自动分配。
tn缓冲区的limb长度
maxamatA中最大的元素的limb长度+1,建议由lmmp_mat22_mul_size_确定
警告
dst!=NULL, nonull(dst), [matA|matB]!=NULL, nonull([matA|matB]), sep(dst,[matA|matB]), tn>0

在文件 mat22_mul.c204 行定义.

211 {
212 lmmp_param_assert(matA != NULL && matB != NULL && dst != NULL);
213 lmmp_param_assert(tn > 0 && maxa > 0);
214 if (matA == matB) {
216 return;
217 }
219 ++tn;
220 if (tp == NULL)
221 tp = BALLOC_TYPE(tn * 7, mp_limb_t);
222
223#define A11 (matA->a00)
224#define A12 (matA->a01)
225#define A21 (matA->a10)
226#define A22 (matA->a11)
227#define B11 (matB->a00)
228#define B12 (matB->a01)
229#define B21 (matB->a10)
230#define B22 (matB->a11)
231#define A11n (matA->n00)
232#define A12n (matA->n01)
233#define A21n (matA->n10)
234#define A22n (matA->n11)
235#define B11n (matB->n00)
236#define B12n (matB->n01)
237#define B21n (matB->n10)
238#define B22n (matB->n11)
239
240#define s1 (dst->a00)
241#define s2 (dst->a01)
242#define s3 (dst->a10)
243#define s4 (dst->a11)
244#define t1 (dst->a00 + maxa)
245#define t2 (dst->a01 + maxa)
246#define t3 (dst->a10 + maxa)
247#define t4 (dst->a11 + maxa)
248#define p1 (tp)
249#define p2 (tp + tn)
250#define p3 (tp + 2 * tn)
251#define p4 (tp + 3 * tn)
252#define p5 (tp + 4 * tn)
253#define p6 (tp + 5 * tn)
254#define p7 (tp + 6 * tn)
255 mp_ssize_t n1, n2, n3, n4, n5, n6, n7, n8;
264
265 n1 = lmmp_mul_signed_(p1, s1, n1, t1, n5);
266 n5 = lmmp_mul_signed_(p2, s2, n2, t2, n6);
267 n2 = lmmp_mul_signed_(p3, s3, n3, t3, n7);
272
273#undef s1
274#undef s2
275#undef s3
276#undef s4
277#undef t1
278#undef t2
279#undef t3
280#undef t4
281
282#define p1n n1
283#define p2n n5
284#define p3n n2
285#define p4n n7
286#define p5n n6
287#define p6n n3
288#define p7n n4
289
290#undef A11
291#undef A12
292#undef A21
293#undef A22
294#undef B11
295#undef B12
296#undef B21
297#undef B22
298#undef A11n
299#undef A12n
300#undef A21n
301#undef A22n
302#undef B11n
303#undef B12n
304#undef B21n
305#undef B22n
306
307#define C11 (dst->a00)
308#define C12 (dst->a01)
309#define C21 (dst->a10)
310#define C22 (dst->a11)
311#define C11n (dst->n00)
312#define C12n (dst->n01)
313#define C21n (dst->n10)
314#define C22n (dst->n11)
315
317#define U1 p5 // U1 = p3 + p5
318#define U2 p1 // U2 = p1 - U1
319#define U3 U1 // U3 = U1 - p2
320#define U1n p5n
321#define U2n p1n
322#define U3n n8
326
331
332#undef C11
333#undef C12
334#undef C21
335#undef C22
336#undef C11n
337#undef C12n
338#undef C21n
339#undef C22n
340#undef U1
341#undef U2
342#undef U3
343#undef U1n
344#undef U2n
345#undef U3n
346
347#undef p1
348#undef p2
349#undef p3
350#undef p4
351#undef p5
352#undef p6
353#undef p7
354}
#define s1
#define C11n
#define s4
#define C22n
#define U2n
#define s3
#define p6n
#define s2
#define C12n
#define t4
#define p6
#define A22n
#define B12n
#define B21
#define t1
#define B21n
#define A22
#define B12
#define t3
void lmmp_mat22_sqr_strassen_(lmmp_mat22_t *dst, const lmmp_mat22_t *mat, mp_ptr tp, mp_size_t tn)
计算(稠密)2x2矩阵平方(STRASSEN算法)
Definition mat22_mul.c:356
#define U3n
#define A11n
#define A12
#define C12
#define U3
#define p1n
#define B22n
#define A21n
#define p4n
#define A21
#define t2
#define U1
#define C21n
#define C22
#define A12n
#define B22
#define p3
#define p3n
#define C21
#define C11
#define p5n
#define p7
#define U1n
#define p7n
#define U2
#define p2n
#define p5
#define p4
#define B11n
#define TEMP_B_DECL
Definition tmp_alloc.h:132
#define BALLOC_TYPE(n, type)
Definition tmp_alloc.h:146
#define TEMP_B_FREE
Definition tmp_alloc.h:159

引用了 A11, A11n, A12, A12n, A21, A21n, A22, A22n, B11, B11n, B12, B12n, B21, B21n, B22, B22n, BALLOC_TYPE, C11, C11n, C12, C12n, C21, C21n, C22, C22n, lmmp_add_signed_(), lmmp_mat22_sqr_strassen_(), lmmp_mul_signed_(), lmmp_param_assert, n, p1, p1n, p2, p2n, p3, p3n, p4, p4n, p5, p5n, p6, p6n, p7, p7n, s1, s2, s3, s4, t1, t2, t3, t4, TEMP_B_DECL, TEMP_B_FREE, tp, U1, U1n, U2, U2n, U3 , 以及 U3n.

被这些函数引用 lmmp_mat22_mul_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ lmmp_mat22_sqr_()

static void lmmp_mat22_sqr_ ( lmmp_mat22_t dst,
const lmmp_mat22_t mat,
int  choose,
mp_size_t  tn 
)
inlinestatic

计算(稠密)2x2矩阵平方

参数
dst结果矩阵。
matA矩阵A
tn缓冲区的limb长度,建议由lmmp_mat22_mul_size_确定
choose选择算法,0表示basecase算法,1表示STRASSEN算法
警告
dst!=NULL, nonull(dst), matA!=NULL, nonull(matA), sep(dst,matA), tn>0

在文件 mat22_mul.h129 行定义.

129 {
132 lmmp_param_assert(tn > 0);
133 lmmp_param_assert(choose == 0 || choose == 1);
134 if (choose == 0) {
136 } else {
138 }
139}
void lmmp_mat22_sqr_strassen_(lmmp_mat22_t *dst, const lmmp_mat22_t *matA, mp_ptr tp, mp_size_t tn)
计算(稠密)2x2矩阵平方(STRASSEN算法)
Definition mat22_mul.c:356
void lmmp_mat22_sqr_basecase_(lmmp_mat22_t *dst, const lmmp_mat22_t *matA, mp_ptr tp, mp_size_t tn)
计算2x2矩阵平方
Definition mat22_mul.c:129

引用了 lmmp_mat22_sqr_basecase_(), lmmp_mat22_sqr_strassen_() , 以及 lmmp_param_assert.

+ 函数调用图:

◆ lmmp_mat22_sqr_basecase_()

void lmmp_mat22_sqr_basecase_ ( lmmp_mat22_t dst,
const lmmp_mat22_t matA,
mp_ptr  tp,
mp_size_t  tn 
)

计算2x2矩阵平方

参数
dst结果矩阵。
matA矩阵A
tp临时缓冲区,用于存储中间结果,需要分配2*tn个limb,若为NULL,则会自动分配。
tn缓冲区的limb长度
警告
dst!=NULL, nonull(dst), matA!=NULL, nonull(matA), sep(dst,matA), tn>0

在文件 mat22_mul.c129 行定义.

134 {
135 TEMP_DECL;
136 if (tp == NULL)
137 tp = TALLOC_TYPE(tn * 2, mp_limb_t);
138#define p1 tp
139#define p2 tp + tn
141 pn1 = lmmp_sqr_signed_(p1, matA->a00, matA->n00);
142 pn2 = lmmp_mul_signed_(p2, matA->a01, matA->n01, matA->a10, matA->n10);
143 dst->n00 = lmmp_add_signed_(dst->a00, p1, pn1, p2, pn2);
144 pn1 = lmmp_mul_signed_(p1, matA->a00, matA->n00, matA->a01, matA->n01);
145 pn2 = lmmp_mul_signed_(p2, matA->a01, matA->n01, matA->a11, matA->n11);
146 dst->n01 = lmmp_add_signed_(dst->a01, p1, pn1, p2, pn2);
147 pn1 = lmmp_mul_signed_(p1, matA->a10, matA->n10, matA->a00, matA->n00);
148 pn2 = lmmp_mul_signed_(p2, matA->a11, matA->n11, matA->a10, matA->n10);
149 dst->n10 = lmmp_add_signed_(dst->a10, p1, pn1, p2, pn2);
150 pn1 = lmmp_mul_signed_(p1, matA->a10, matA->n10, matA->a01, matA->n01);
151 pn2 = lmmp_sqr_signed_(p2, matA->a11, matA->n11);
152 dst->n11 = lmmp_add_signed_(dst->a11, p1, pn1, p2, pn2);
153#undef p1
154#undef p2
155 TEMP_FREE;
156}
static mp_ssize_t lmmp_sqr_signed_(mp_ptr dst, mp_srcptr numa, mp_ssize_t na)
计算带符号数的平方
Definition signed.h:168

引用了 lmmp_add_signed_(), lmmp_mul_signed_(), lmmp_sqr_signed_(), n, p1, p2, TALLOC_TYPE, TEMP_DECL, TEMP_FREE , 以及 tp.

被这些函数引用 lmmp_mat22_mul_basecase_() , 以及 lmmp_mat22_sqr_().

+ 函数调用图:
+ 这是这个函数的调用关系图:

◆ lmmp_mat22_sqr_strassen_()

void lmmp_mat22_sqr_strassen_ ( lmmp_mat22_t dst,
const lmmp_mat22_t matA,
mp_ptr  tp,
mp_size_t  tn 
)

计算(稠密)2x2矩阵平方(STRASSEN算法)

参数
dst结果矩阵。
matA矩阵A
tp临时缓冲区,用于存储中间结果,需要分配7*(tn+1)个limb,若为NULL,则会自动分配。
tn缓冲区的limb长度
警告
dst!=NULL, nonull(dst), matA!=NULL, nonull(matA), sep(dst,matA), tn>0

在文件 mat22_mul.c356 行定义.

356 {
359 ++tn;
360 if (tp == NULL)
361 tp = BALLOC_TYPE(tn * 7, mp_limb_t);
362
363#define A11 (mat->a00)
364#define A12 (mat->a01)
365#define A21 (mat->a10)
366#define A22 (mat->a11)
367#define A11n (mat->n00)
368#define A12n (mat->n01)
369#define A21n (mat->n10)
370#define A22n (mat->n11)
371
372#define s1 (dst->a00)
373#define s2 (dst->a01)
374#define s3 (dst->a10)
375#define s4 (dst->a11)
376#define p1 (tp)
377#define p2 (tp + tn)
378#define p3 (tp + 2 * tn)
379#define p4 (tp + 3 * tn)
380#define p5 (tp + 4 * tn)
381#define p6 (tp + 5 * tn)
382#define p7 (tp + 6 * tn)
383 mp_ssize_t n1, n2, n3, n4, n5, n6, n7, n8;
388
396
397#undef s1
398#undef s2
399#undef s3
400#undef s4
401
402#define p1n n1
403#define p2n n5
404#define p3n n2
405#define p4n n7
406#define p5n n6
407#define p6n n3
408#define p7n n4
409
410#undef A11
411#undef A12
412#undef A21
413#undef A22
414#undef A11n
415#undef A12n
416#undef A21n
417#undef A22n
418
419#define C11 (dst->a00)
420#define C12 (dst->a01)
421#define C21 (dst->a10)
422#define C22 (dst->a11)
423#define C11n (dst->n00)
424#define C12n (dst->n01)
425#define C21n (dst->n10)
426#define C22n (dst->n11)
427
429#define U1 p5 // U1 = p3 + p5
430#define U2 p1 // U2 = p1 - U1
431#define U3 U1 // U3 = U1 - p2
432#define U1n p5n
433#define U2n p1n
434#define U3n n8
438
443
444#undef C11
445#undef C12
446#undef C21
447#undef C22
448#undef C11n
449#undef C12n
450#undef C21n
451#undef C22n
452#undef U1
453#undef U2
454#undef U3
455#undef U1n
456#undef U2n
457#undef U3n
458
459#undef p1
460#undef p2
461#undef p3
462#undef p4
463#undef p5
464#undef p6
465#undef p7
466}

引用了 A11, A11n, A12, A12n, A21, A21n, A22, A22n, BALLOC_TYPE, C11, C11n, C12, C12n, C21, C21n, C22, C22n, lmmp_add_signed_(), lmmp_mul_signed_(), lmmp_param_assert, lmmp_sqr_signed_(), n, p1, p1n, p2, p2n, p3, p3n, p4, p4n, p5, p5n, p6, p6n, p7, p7n, s1, s2, s3, s4, TEMP_B_DECL, TEMP_B_FREE, tp, U1, U1n, U2, U2n, U3 , 以及 U3n.

被这些函数引用 lmmp_mat22_mul_strassen_() , 以及 lmmp_mat22_sqr_().

+ 函数调用图:
+ 这是这个函数的调用关系图: