Files
MP-SPDZ/Protocols/RepRingOnlyEdabitPrep.hpp
2025-05-30 13:35:02 +10:00

61 lines
1.9 KiB
C++

/*
* RepRingOnlyEdabitPrep.cpp
*
*/
#ifndef PROTOCOLS_REPRINGONLYEDABITPREP_HPP_
#define PROTOCOLS_REPRINGONLYEDABITPREP_HPP_
#include "RepRingOnlyEdabitPrep.h"
#include "GC/BitAdder.h"
#include "Processor/Instruction.h"
template<class T>
void RepRingOnlyEdabitPrep<T>::buffer_edabits(int n_bits, ThreadQueues*)
{
CODE_LOCATION
assert(this->proc);
int dl = T::bit_type::default_length;
int buffer_size = DIV_CEIL(BaseMachine::edabit_batch_size<T>(n_bits, this->buffer_size), dl) * dl;
StackedVector<T> swholes;
swholes.resize(buffer_size);
Instruction inst;
inst.r[0] = 0;
inst.n = n_bits;
inst.size = buffer_size;
this->proc->protocol.randoms_inst(swholes, inst);
vector<T> wholes(swholes.begin(), swholes.end());
auto& P = this->proc->P;
vector<int> regs(P.num_players() * n_bits);
for (size_t i = 0; i < regs.size(); i++)
regs[i] = i * buffer_size / dl;
typedef typename T::bit_type bt;
StackedVector<bt> bits(n_bits * P.num_players() * buffer_size);
T::split(bits, regs, n_bits, wholes.data(), wholes.size(),
*GC::ShareThread < bt > ::s().protocol);
BitAdder bit_adder;
vector<vector<vector<bt>>> summands;
for (int i = 0; i < n_bits; i++)
{
summands.push_back({});
auto& x = summands.back();
for (int j = 0; j < P.num_players(); j++)
{
x.push_back({});
auto& y = x.back();
for (int k = 0; k < buffer_size / dl; k++)
y.push_back(bits.at(k + buffer_size / dl * (j + P.num_players() * i)));
}
}
vector<vector<bt>> sums(buffer_size / dl);
auto &party = GC::ShareThread<typename T::bit_type>::s();
SubProcessor<bt> bit_proc(party.MC->get_part_MC(), this->proc->bit_prep, P);
bit_adder.multi_add(sums, summands, 0, buffer_size / dl, bit_proc, dl, 0);
this->push_edabits(this->edabits[{false, n_bits}], wholes, sums);
}
#endif