Обмен данными между потоками на Intel Xeon Phi - модель BSP
Я хочу разработать массовую синхронную параллельную модель на Intel Xeon Phi, используя только std::thread (без других библиотек). Я делю код на 2 класса: Superstep и Worker. Класс Superstep содержит вектор рабочих.
superstep.hpp
template <typename T>
class SuperStep {
private:
int nw;
std::vector<T> input;
std::vector<std::vector<T>> chunks;
std::vector<std::unique_ptr<Worker<T>>> workers; //vector of pointers
std::vector<std::vector<T>> output;
public:
SuperStep(int n, std::vector<T> input);
~SuperStep();
std::vector<T> get_input();
int get_parallel_degree();
template<typename F,typename ...Args>
void computation(std::function<F(Args...)> b);
void communication();
};
Рабочий класс - это оболочка потока
worker.hpp
template <typename T>
class Worker {
private:
int id;
SuperStep<T> *ss;
std::thread thread;
std::vector<T> input;
std::vector<T> output;
public:
Worker(int id, SuperStep<T> *s);
Worker(const Worker&) = delete;
Worker(Worker &&other);
Worker& operator=(const Worker&) = delete;
Worker& operator=(Worker&&) = delete;
~Worker();
int get_id();
std::vector<T> get_output();
void set_input(std::vector<T>, int worker_index);
template<typename F,typename ...Args>
void work(std::function<F(Args...)> body);
};
Когда я запускаю вычисление Superstep, каждый рабочий вызывает свою функцию work(), которая вычисляет вывод рабочего из ввода рабочего, используя "тело" функции шаблона.
//Superstep Computation
template<typename T>
template<typename F,typename ...Args>
void SuperStep<T>::computation(std::function<F(Args...)> body)
{
for (auto &w: workers)
w->work(body);
}
//////////////////////////////////////////////////////////////////
//Worker work function
template<typename T>
template<typename F, typename ...Args>
void Worker<T>::work(std::function<F(Args...)> body)
{
thread = std::thread{[this,body]()
{
output = body(input);
}
};
}
Я не могу понять, как реализовать этап связи на процессоре MIC, таком как Xeon Phi, или, скорее, как обмениваться результатами каждого отдельного рабочего с другими рабочими. Связь заключается в отправке данных в процессор (я не знаю как) или сохранении выходных данных в дублированном блокируемом векторе (но это кажется более подходом к "общей памяти")?
Заранее спасибо!