2021SC@SDUSC
2021-12-27
前言
本篇开始我将讨论SEAL中performance.cpp的代码实现,这一部分实现了对SEAL的性能测度。
源码分析
主要分析void bfv_performance_test(SEALContext context)。
先是初始化以及打印一些参数。
chrono::high_resolution_clock::time_point time_start, time_end;
print_parameters(context);
cout << endl;
auto &parms = context.first_context_data()->parms();
auto &plain_modulus = parms.plain_modulus();
size_t poly_modulus_degree = parms.poly_modulus_degree();
然后用之前分析过的KeyGenerator,生成公钥、私钥:
cout << "Generating secret/public keys: ";
KeyGenerator keygen(context);
cout << "Done" << endl;
auto secret_key = keygen.secret_key();
PublicKey public_key;
keygen.create_public_key(public_key);
RelinKeys relin_keys;
GaloisKeys gal_keys;
时间变量如下:
//时间
chrono::microseconds time_diff;
生成relinearization keys重线性密钥:
cout << "Generating relinearization keys: ";
time_start = chrono::high_resolution_clock::now();
keygen.create_relin_keys(relin_keys);
time_end = chrono::high_resolution_clock::now();
time_diff = chrono::duration_cast<chrono::microseconds>(time_end - time_start);
cout << "Done [" << time_diff.count() << " microseconds]" << endl;
if (!context.key_context_data()->qualifiers().using_batching)
{
cout << "Given encryption parameters do not support batching." << endl;
return;
}
关于relinearization keys(重线性密钥):
利用 Lemma 2,我们已经有了一个两个密文相乘的密文,但是,剩下的问题是密文中的元素数量增加了。为了纠正这种现象,我们需要一个叫做 Relinearisation 的过程,将一个 degree 2 密文再次还原成 degree 1 的密文。恰恰是这一步,需要引入重线性密钥。
生成伽罗瓦键。在更大的示例中,Galois键可以使用大量内存,这在受限的系统中可能是一个问题。用户应该尝试一些较 大的测试运行,并观察它们对内存池分配大小的影响。从打印结果可以看出,密钥生成也需要很长时间:
cout << "Generating Galois keys: ";
time_start = chrono::high_resolution_clock::now();
keygen.create_galois_keys(gal_keys);
time_end = chrono::high_resolution_clock::now();
time_diff = chrono::duration_cast<chrono::microseconds>(time_end - time_start);
cout << "Done [" << time_diff.count() << " microseconds]" << endl;
最后,保存每个操作使用的总时间,并且设置运行次数,填充要进行批处理的值向量:
chrono::microseconds time_batch_sum(0);
chrono::microseconds time_unbatch_sum(0);
chrono::microseconds time_encrypt_sum(0);
chrono::microseconds time_decrypt_sum(0);
chrono::microseconds time_add_sum(0);
chrono::microseconds time_multiply_sum(0);
chrono::microseconds time_multiply_plain_sum(0);
chrono::microseconds time_square_sum(0);
chrono::microseconds time_relinearize_sum(0);
chrono::microseconds time_rotate_rows_one_step_sum(0);
chrono::microseconds time_rotate_rows_random_sum(0);
chrono::microseconds time_rotate_columns_sum(0);
chrono::microseconds time_serialize_sum(0);
#ifdef SEAL_USE_ZLIB
chrono::microseconds time_serialize_zlib_sum(0);
#endif
#ifdef SEAL_USE_ZSTD
chrono::microseconds time_serialize_zstd_sum(0);
#endif
/*
设置测试运行次数
*/
long long count = 10;
size_t slot_count = batch_encoder.slot_count();
vector<uint64_t> pod_vector;
random_device rd;
for (size_t i = 0; i < slot_count; i++)
{
pod_vector.push_back(plain_modulus.reduce(rd()));
}
cout << "Running tests ";
最后就能看到输出了。
扫描二维码关注公众号,回复:
14222980 查看本文章

效率测试
BFV效率测试
> Run performance test (1 ~ 4) or go back (0): 1
+--------------------------------------------------------------------------+
| BFV Performance Test with Degrees: 4096, 8192, and 16384 |
+--------------------------------------------------------------------------+
/
| Encryption parameters :
| scheme: BFV
| poly_modulus_degree: 4096
| coeff_modulus size: 109 (36 + 36 + 37) bits
| plain_modulus: 786433
\
Generating secret/public keys: Done
Generating relinearization keys: Done [2544 microseconds]
Generating Galois keys: Done [53215 microseconds]
Running tests .......... Done
Average batch: 78 microseconds
Average unbatch: 99 microseconds
Average encrypt: 2972 microseconds
Average decrypt: 481 microseconds
Average add: 31 microseconds
Average multiply: 4624 microseconds
Average multiply plain: 599 microseconds
Average square: 3434 microseconds
Average relinearize: 872 microseconds
Average rotate rows one step: 896 microseconds
Average rotate rows random: 3489 microseconds
Average rotate columns: 876 microseconds
Average serialize ciphertext: 17 microseconds
Average compressed (ZLIB) serialize ciphertext: 15994 microseconds
Average compressed (Zstandard) serialize ciphertext: 2713 microseconds
/
| Encryption parameters :
| scheme: BFV
| poly_modulus_degree: 8192
| coeff_modulus size: 218 (43 + 43 + 44 + 44 + 44) bits
| plain_modulus: 786433
\
Generating secret/public keys: Done
Generating relinearization keys: Done [13098 microseconds]
Generating Galois keys: Done [313981 microseconds]
Running tests .......... Done
Average batch: 155 microseconds
Average unbatch: 163 microseconds
Average encrypt: 6385 microseconds
Average decrypt: 1472 microseconds
Average add: 122 microseconds
Average multiply: 16976 microseconds
Average multiply plain: 2564 microseconds
Average square: 12623 microseconds
Average relinearize: 4715 microseconds
Average rotate rows one step: 4750 microseconds
Average rotate rows random: 23478 microseconds
Average rotate columns: 4569 microseconds
Average serialize ciphertext: 48 microseconds
Average compressed (ZLIB) serialize ciphertext: 40772 microseconds
Average compressed (Zstandard) serialize ciphertext: 1628 microseconds
/
| Encryption parameters :
| scheme: BFV
| poly_modulus_degree: 16384
| coeff_modulus size: 438 (48 + 48 + 48 + 49 + 49 + 49 + 49 + 49 + 49) bits
| plain_modulus: 786433
\
Generating secret/public keys: Done
Generating relinearization keys: Done [97873 microseconds]
Generating Galois keys: Done [2409779 microseconds]
Running tests .......... Done
Average batch: 265 microseconds
Average unbatch: 333 microseconds
Average encrypt: 19389 microseconds
Average decrypt: 5899 microseconds
Average add: 511 microseconds
Average multiply: 70743 microseconds
Average multiply plain: 10712 microseconds
Average square: 51595 microseconds
Average relinearize: 27214 microseconds
Average rotate rows one step: 27952 microseconds
Average rotate rows random: 129684 microseconds
Average rotate columns: 27694 microseconds
Average serialize ciphertext: 321 microseconds
Average compressed (ZLIB) serialize ciphertext: 176645 microseconds
Average compressed (Zstandard) serialize ciphertext: 7302 microseconds
CKKS效率测试
> Run performance test (1 ~ 4) or go back (0): 3
+---------------------------------------------------------------------------+
| CKKS Performance Test with Degrees: 4096, 8192, and 16384 |
+---------------------------------------------------------------------------+
/
| Encryption parameters :
| scheme: CKKS
| poly_modulus_degree: 4096
| coeff_modulus size: 109 (36 + 36 + 37) bits
\
Generating secret/public keys: Done
Generating relinearization keys: Done [2648 microseconds]
Generating Galois keys: Done [50264 microseconds]
Running tests .......... Done
Average encode: 355 microseconds
Average decode: 380 microseconds
Average encrypt: 2101 microseconds
Average decrypt: 53 microseconds
Average add: 35 microseconds
Average multiply: 157 microseconds
Average multiply plain: 64 microseconds
Average square: 122 microseconds
Average relinearize: 924 microseconds
Average rescale: 223 microseconds
Average rotate vector one step: 834 microseconds
Average rotate vector random: 3141 microseconds
Average complex conjugate: 831 microseconds
Average serialize ciphertext: 14 microseconds
Average compressed (ZLIB) serialize ciphertext: 11101 microseconds
Average compressed (Zstandard) serialize ciphertext: 1787 microseconds
/
| Encryption parameters :
| scheme: CKKS
| poly_modulus_degree: 8192
| coeff_modulus size: 218 (43 + 43 + 44 + 44 + 44) bits
\
Generating secret/public keys: Done
Generating relinearization keys: Done [13624 microseconds]
Generating Galois keys: Done [324947 microseconds]
Running tests .......... Done
Average encode: 1233 microseconds
Average decode: 1883 microseconds
Average encrypt: 6165 microseconds
Average decrypt: 238 microseconds
Average add: 131 microseconds
Average multiply: 575 microseconds
Average multiply plain: 258 microseconds
Average square: 494 microseconds
Average relinearize: 4521 microseconds
Average rescale: 949 microseconds
Average rotate vector one step: 4386 microseconds
Average rotate vector random: 19942 microseconds
Average complex conjugate: 5834 microseconds
Average serialize ciphertext: 62 microseconds
Average compressed (ZLIB) serialize ciphertext: 48368 microseconds
Average compressed (Zstandard) serialize ciphertext: 2377 microseconds
/
| Encryption parameters :
| scheme: CKKS
| poly_modulus_degree: 16384
| coeff_modulus size: 438 (48 + 48 + 48 + 49 + 49 + 49 + 49 + 49 + 49) bits
\
Generating secret/public keys: Done
Generating relinearization keys: Done [162775 microseconds]
Generating Galois keys: Done [4053943 microseconds]
Running tests .......... Done
Average encode: 4565 microseconds
Average decode: 10773 microseconds
Average encrypt: 28865 microseconds
Average decrypt: 1433 microseconds
Average add: 763 microseconds
Average multiply: 3571 microseconds
Average multiply plain: 1542 microseconds
Average square: 3002 microseconds
Average relinearize: 42700 microseconds
Average rescale: 7313 microseconds
Average rotate vector one step: 43168 microseconds
Average rotate vector random: 219552 microseconds
Average complex conjugate: 47044 microseconds
Average serialize ciphertext: 375 microseconds
Average compressed (ZLIB) serialize ciphertext: 284790 microseconds
Average compressed (Zstandard) serialize ciphertext: 8401 microseconds
结语
本文标志着examples文件夹的全部分析,至此,我们完成了对于SEAL的代码分析部分的最后一篇,后面我会再写一篇理论补充以及总结报告。