寻求提高Microsoft密封库计算效率的方法
Seeking ways to improve the calculation efficiency of Microsoft's seal library
我正在使用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。算法的细节太复杂了,无法在这里解释,但你可以在我发布的维基百科文章中找到它们。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- 在计算中使用二的幂有多有利可图
- 如何计算文件中的"columns"数?
- 计算排序向量的向量中唯一值的计数
- 如何使用 std::累积在 C++ 中计算总和立方体
- 使用Qt C++计算类似Git的SHA1哈希
- OpenCV C++.快速计算混淆矩阵
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- C++如何计算用户输入的数字中的偶数位数
- 寻求提高Microsoft密封库计算效率的方法
- C 矩阵计算效率
- 在opencv中,使用垫子类型计算马氏距离太慢了。如何提高效率?
- 多线程计算均值和std并不能提高效率
- 提高了一个非常简单但用途广泛的函数(计算晶格中原子的邻居)的效率
- 计算效率高的C++-一般阅读
- 在c++中将两个相关的std::堆栈合并为std::map的计算效率如何?
- OpenCV: filter2D函数的计算效率