寻求提高Microsoft密封库计算效率的方法

Seeking ways to improve the calculation efficiency of Microsoft's seal library

本文关键字:计算 效率 方法 密封 Microsoft      更新时间:2023-10-16

我正在使用Microsoft的同态加密库密封来计算两个密文向量的点积。我发现当密文向量的大小为 600 时,大约需要 12 秒。 不知道有没有办法提高我的代码效率,还是这就是同态加密计算速度的上限?

...
EncryptionParameters parms(scheme_type::BFV);
size_t poly_modulus_degree = 8192;
parms.set_poly_modulus_degree(poly_modulus_degree);
parms.set_coeff_modulus(CoeffModulus::BFVDefault(poly_modulus_degree));
parms.set_plain_modulus(1ll<<20);
auto context = SEALContext::Create(parms);
...
for(int i=1;i<=M;i++){
for(int j=i;j<=M;j++){
for(int k=1;k<=N;k++){
...
evaluator.multiply_inplace(ca,cb);
evaluator.add_inplace(c_sum,ca);
...
}
}
}

您在发布的代码片段中省略了很多内容,因此我的答案基于您正在实现矩阵乘法的假设(因为代码中有 3 个嵌套的四个循环,并且矢量点积只需使用 1 个循环即可轻松实现(。我猜你已经选择了简单的实现,这是一个立方算法(O(n^3)复杂(,所以你的代码需要这么长时间来执行也就不足为奇了。

存在更好的算法,但它们也有其自身的缺点。例如,Coppersmith-Winograd算法具有大约O(n^2.37)的复杂性,但在实践中使用并不实用。它通常用于算法理论中,以证明包含矩阵乘法的其他算法的复杂性。另一种更快的算法(Strassen算法(具有O(n^2.8074)的复杂性,在实践中很有用,但缺点是它只对足够大的矩阵有用,并且实现比简单的更复杂。

这意味着,如果速度的提高值得使你的实现复杂化,那么你将不得不尝试找到 Strassen 算法变得更快的大小,并实现一种混合算法,该算法对较小的矩阵使用简单的实现,对较大的矩阵使用 Strassen。算法的细节太复杂了,无法在这里解释,但你可以在我发布的维基百科文章中找到它们。