in gemmology_fwd.h [39:63]
inline void operator()(size_t Start, size_t End, size_t Stride, F&& f) {
const size_t NbIter = (End - Start) / Stride;
const size_t NbThread = std::min(NbIter, MaxPoolSize);
const size_t Chunk = (NbIter / NbThread) * Stride;
size_t Curr = Start, Next = Start;
for(size_t threadID = 0; threadID < NbThread - 1; ++threadID) {
Next += Chunk;
Pool.emplace_back([=]() {
for(size_t i = Curr; i < Next; i += Stride) {
f(i);
};
});
Curr = Next;
}
for(size_t i = Next; i < End; i += Stride) {
f(i);
};
for(size_t threadID = 0; threadID < Pool.size(); ++threadID) {
Pool[threadID].join();
}
Pool.clear();
}