我正在构建一个处理不同基数的程序,我想通过使用并行编程来优化它,但我对所有这些都是新手。
现在,我正在尝试实现一个并行的 Karatsuba 乘法算法:
public static NX MulAK(NX A, NX B){
// ¶ Safeguard:
if(A.Base != B.Base){
Console.Error.WriteLine("\tError:\nA multiplication of numbers with different bases was attempted!");
return null!;
}
// ¶ Init:
MatchLength(ref A, ref B);
// Base Case:
if(A.Len() == 1){return SingleMul(A, B[0]);}
// ¶ Init:
(NX A_L, NX A_H) = SplitHalf(A);
(NX B_L, NX B_H) = SplitHalf(B);
// ¶ Recursive calls in parallel:
NX L;
NX M;
NX H;
Parallel.Invoke(
() => {L = MulAK(A_L, B_L);},
() => {M = MulAK(A_L + B_H, A_H + B_L);},
() => {H = MulAK(A_H, B_H);}
);
// Return:
return
(L
+ (M - L - H).ShiftPow(A.Len() / 2)
+ H.ShiftPow(A.Len())
).ShiftPow(A.Powr + B.Powr);
}
调用 Parallel.Invoke() 时它不会显示任何错误,但在返回时会显示:
使用未分配的局部变量 'L' [NumberX] csharp(CS0165)
...对于 L 和所有其他人。
就我而言,如何使 Karatsuba 的递归调用并行工作?