Performance comparisons
We’ve benchmarked our FHE compiler against existing state-of-the-art (that support comparisons over encrypted data).
Of the 5 compilers we consider, ours is the only one to rely on circuit bootstrapping as the primary bootstrapping method. Concrete relies on programmable/functional bootstrapping whereas Google, E3, and Cingulata rely on the older gate bootstrapping approach.
We consider a variety of programs that showcase comparisons over encryped data, arithmetic operations over encrypted data, etc.
Experiments were performed on an AWS c7a.16xlarge instance (64 vCPUs, 128GB RAM). Using Lattice Estimator, we estimate that our compiler and Concrete should provide 128 bits of security. Google’s transpiler and Cingulata provide 118 bits of security, whereas E3 provides approximately 94 bits of security.
Transparently, our approach shines when sufficient cores are provided with which we can parallelize tasks across. You will see less of a performance benefit with our compiler/approach if the FHE computation is being carried out on a machine with relatively few cores (e.g. 16, 32 cores). We see a significant speed up in performance time as we go from 1 thread to 64 for the below programs. Please note that this only applies to the computing party, there’s no issue at all of the end-user (providing data) uses a laptop!
Chi-squared benchmarks
We look at how our compiler performs for a FHE-friendly variant of chi-squared test with respect to runtime of the generated FHE program, size of the compiler output, and memory usage.
Compiler | Runtime | Program size | Memory usage |
---|---|---|---|
Parasol | 521ms | 232B | 365MB |
Concrete | 5.29s | 1.41kB | 1.82GB |
Google Transpiler | 13.8s | 323kB | 299MB |
E3-TFHE | 440s | 2.87MB | 182MB |
Cingulata-TFHE | 85.6s | 579kB | 254MB |
For Concrete (which determines precision based on developer-provided example inputs), we pass in 8-bit inputs to maintain the same output precision as all the other compilers.
Cardio benchmarks
We also consider how our compiler performs for the cardio program with respect to runtime of the generated FHE programs, size of the compiler output, and memory usage.
Compiler | Runtime | Program size | Memory usage |
---|---|---|---|
Parasol | 409ms | 472B | 399MB |
Concrete | 2.13s | 10.4kB | 4.0GB |
Google Transpiler | 3.26s | 11.4kB | 274MB |
E3-TFHE | 119s | 1.87MB | 181MB |
Cingulata-TFHE | 2.98s | 613kB | 254MB |
For Concrete, we don’t restriction precision as the output is a small integer anyway.
Scaling results
Next, we consider how the FHE compilers scale as we vary the number of inputs.
Auction benchmarks
We consider how FHE compilers perform on a first-price sealed-bid auction as we vary the number of bids.
For our work, please note that we can obtain significantly better times when we hand-code the auction using our variant of the TFHE scheme. Nevertheless, we still observe that Parasol performs best here against all other FHE compilers.
2 bids | 4 bids | 8 bids | 16 bids | 32 bids | |
---|---|---|---|---|---|
Parasol | 0.098s | 0.275s | 0.625s | 1.315s | 2.714s |
Concrete | 24.1s | 86.4s | 264s | 694s | 1690s |
Google Transpiler | 2.36s | 6.72s | 15.4s | 33.1s | 68.2s |
E3-TFHE | 12.4s | 36.6s | 84.8s | 182s | 379s |
Cingulata-TFHE | 1.48s | 4.33s | 10.3s | 22.4s | 47.2s |
We use 16-bit precision which signficantly slows down the auction times for everyone. For Concrete, we pass in 16-bit example inputs to maintain the same input precision as the other works.