Help with CKKS bootstrapping

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.

Are you setting the run to be single-threaded instead of using how many threads your laptop has available? You can do this by using -DWITH OPENMP=OFF when running cmake.

Here are some older experiments on CKKS bootstrapping in OpenFHE https://eprint.iacr.org/2023/149.pdf.

By the way, you can define BOOTSTRAPTIMING and this will print the runtime of bootstrapping split into steps.

Thank you. I am using a single thread. But my concern is, even with a single thread, my bootstrap timing is in the order of 10 times faster than the reported timing of each bootstrapping in the Meta-BTS paper, as I shared above. It should be around 20-30 seconds as per the timings reported on the paper, instead of 2-3 seconds that I get now, even with a single threaded computation.

Are you using parameters.SetSecurityLevel(HEStd_128_classic) instead of parameters.SetSecurityLevel(HEStd_NotSet) as in the example you mentioned? For log(PQ) = 1800, the ring dimension should be 2^{17} for 128-bit security.

Can you please provide your code even if it is very similar to the example, so we can ensure all parameters are set correctly?