Обмен данными между потоками на Intel Xeon Phi - модель BSP - PullRequest
0 голосов
/ 07 января 2020

Я хочу разработать Bulk Synchronous Parallel Model на Intel Xeon Phi, используя только std :: thread (без других библиотек). Я организую код в 2 класса: Супершаг и Рабочий. Класс Superstep содержит вектор Workers.

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 (), которая вычисляет вывод работника из ввода работника, используя шаблонную функцию "body".

//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);            
        }
    };
}

Я не могу понять, как реализовать Коммуникацию Фаза на процессоре MI C, таком как Xeon Phi, или, скорее, как обмениваться результатами каждого отдельного работника с другими работниками. Коммуникация заключается в отправке данных на процессор (я не знаю как) или сохранении выходных данных в дублирующемся блокируемом векторе (но это, кажется, более подход «общей памяти»)?

Заранее спасибо!

...