I am trying to understand the openFHE implementation of CKKS bootstrapping and understand the time taken by it. I understand the implementation is of Meta-BTS. When I run the repo example of simple bootstrapping here, I use the below code to understand the time taken for a single bootstrapping (around line-142 of the same code):
auto start = std::chrono::high_resolution_clock::now();
auto ciphertextAfter = cryptoContext->EvalBootstrap(ciph);
auto end = std::chrono::high_resolution_clock::now();
std::cout <<“Time taken for 1 bootstrapping”<< std::chrono::duration_caststd::chrono::milliseconds(end-start).count()<<std::endl;
Each time I run the above, I get the runtime for a single bootstrap somewhere in the range of 3000 ms to 7000 ms, as and when I adjust the level-budget and levelsAvailableAfterBootstrap to adjust the multiplicative depth as per my needs. For an example, I have used ring dimension 2^16 and 128 bit security, level budget = {2,2} and levelsAvailableAfterBootstrap=4 for your reference, and get the above bootstrap time ~2500 ms and log PQ around 1800 bits.
Now, I am running this in my laptop, but where I am confused is if this is the expected timing for running CKKS bootstrapping on CPU. I have not changed anything else in the code except for the ring dimension, security bit, level-budget and levels after bootstrap. The meta-BTS paper mentions the runtime for a single CKKS bootstrap with a single iteration for N=16 to be somewhere around 20-40 seconds! Am I going wrong somewhere? I am not using any optimization anywhere.