Как сообщить другому узлу, что больше нет работы с главного узла - PullRequest
0 голосов
/ 09 апреля 2019

Я бы хотел попросить некоторую помощь для завершения распределения рабочей нагрузки в реализации mpi.

Идея состоит в том, что узел 0 будет иметь список имен файлов ("list_file"). Когда другие узлы свободны, они отправят запрос на файл узлу 0, а узел 0 отправит обратно имя файла.

Когда больше нет файла для отправки, узел 0 завершает свою работу. Однако как я могу сообщить потокам считывателя в других узлах, что у узла 0 больше нет файла, и они должны прекратить ждать, пока узел 0 отправит новый файл поверх.

// pid 0 will collect all input text file names and distribute them to other nodes
if (pid == 0)
{
    vector<char*> list_file;                    // a vector to hold the input text file names to be processed

    GetInputFile(argv, list_file);              // argv[1] is a text file that contains the input text files to be processed, all the text file names will be added to list_file
    num_file_remaining = list_file.size();      // number of file remained in the queue to be processed

    MPI_Status requeststats;            // for MPI_recv

    // listen to request for file from other nodes as long as there is file left in list_file
    while (num_file_remaining != 0)
    {
        MPI_recv(NULL, 0, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &requeststats);       // listen to request for file
        MPI_send(list_file.back(), 5 * MAX_WORD_LENGTH, MPI_CHAR, requeststats.MPI_SOURCE, requeststats.MPI_SOURCE, MPI_COMM_WORLD);            // send the file to respective node
        list_file.pop_back();       // remove the file that was just sent
        num_file_remaining -= 1;    // reduce the number of file remained in the queue
    }
}


// other nodes will request work from pid 0
if (pid != 0)
{
    char* file_name;

    while (num_file_remaining != 0)
    {
        MPI_send(NULL, 0, MPI_INT, 0, 0, MPI_COMM_WORLD);           // send the request for a file to node 0
        MPI_recv(file_name, 5 * MAX_WORD_LENGTH, MPI_CHAR, 0, pid, MPI_COMM_WORLD, MPI_STATUS_IGNORE);      // receive the file from node 0
        cout << "pid: " << pid << " - " << file_name << endl;       // process the file
        // HOW TO EXIT THE LOOP WHEN NO MORE FILE TO RECEIVE FROM NODE 0
    }
}

1 Ответ

0 голосов
/ 09 апреля 2019

Иметь активный MPI_Irecv звонок:

// set this tag to whatever you want and don’t use it for anything else
constexpr int AM_I_FINISHED_TAG = 1376;
MPI_Request am_I_finished = MPI_Irecv(nullptr, 0, MPI_INT, 0, AM_I_FINISHED_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

Всякий раз, когда вы заканчиваете обработку файла на дочернем узле, используйте MPI_Test, чтобы проверить, завершен ли этот запрос. Когда у основного узла больше нет работы для дочернего узла, пусть он отправляет данные на все дочерние узлы, используя AM_I_FINISHED_TAG.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...