Program Listing for File context.cu
↰ Return to documentation for file (src/lib/host/tfhe/context.cu)
// Copyright 2024-2026 Alişah Özcan
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
// Developer: Alişah Özcan
#include <heongpu/host/tfhe/context.cuh>
namespace heongpu
{
HEContextImpl<Scheme::TFHE>::HEContextImpl()
: HEContextImpl(MemoryPoolConfig::Defaults())
{
}
HEContextImpl<Scheme::TFHE>::HEContextImpl(
const MemoryPoolConfig& pool_config)
{
// Memory pool initialization
MemoryPool::instance().initialize(pool_config);
MemoryPool::instance().use_memory_pool(pool_config.use_memory_pool);
cudaDeviceSynchronize();
prime_ = Modulus64(1152921504606877697ULL);
Data64 psi = 1689264667710614ULL;
Data64 psi_inv = OPERATOR64::modinv(psi, prime_);
std::vector<Root64> forward_table = compute_ntt_table(psi, prime_, 10);
std::vector<Root64> inverse_table =
compute_ntt_table(psi_inv, prime_, 10);
ntt_table_ = std::make_shared<DeviceVector<Root64>>(forward_table);
intt_table_ = std::make_shared<DeviceVector<Root64>>(inverse_table);
n_inverse_ = OPERATOR64::modinv(1024, prime_);
ks_base_bit_ = 2;
ks_length_ = 8;
double sqrt_two_over_pi = std::sqrt(2.0 / M_PI);
ks_stdev_ = (1.0 / 32768.0) * sqrt_two_over_pi;
bk_stdev_ = (9e-9) * sqrt_two_over_pi;
max_stdev_ = (1.0 / 64.0) * sqrt_two_over_pi;
n_ = 512;
N_ = 1024;
k_ = 1;
bk_l_ = 2;
bk_bg_bit_ = 10;
bg_ = 1 << bk_bg_bit_;
half_bg_ = bg_ >> 1;
mask_mod_ = bg_ - 1;
kpl_ = (k_ + 1) * bk_l_;
h_ = compute_h(bk_l_, bk_bg_bit_);
offset_ = compute_offset(bk_l_, bk_bg_bit_, half_bg_);
}
std::vector<int> HEContextImpl<Scheme::TFHE>::compute_h(int l, int bg_bit)
{
std::vector<int> h(l);
for (int i = 0; i < l; ++i)
{
int shift = 32 - (i + 1) * bg_bit;
h[i] = static_cast<int>(1) << shift;
}
return h;
}
int HEContextImpl<Scheme::TFHE>::compute_offset(int l, int bg_bit,
int half_bg)
{
int64_t sum = 0;
for (int i = 1; i <= l; ++i)
{
int shift = 32 - i * bg_bit;
sum += static_cast<int64_t>(1) << shift;
}
int64_t result = sum * half_bg;
return static_cast<int>(result);
}
std::vector<Root64>
HEContextImpl<Scheme::TFHE>::compute_ntt_table(Data64 psi, Modulus64 primes,
int n_power)
{
int n = 1 << n_power;
std::vector<Root64> forward_table; // bit reverse order
std::vector<Root64> table;
table.push_back(1);
for (int j = 1; j < n; j++)
{
Data64 exp = OPERATOR64::mult(table[(j - 1)], psi, primes);
table.push_back(exp);
}
for (int j = 0; j < n; j++) // take bit reverse order
{
forward_table.push_back(table[gpuntt::bitreverse(j, n_power)]);
}
return forward_table;
}
template class HEContextImpl<Scheme::TFHE>;
} // namespace heongpu