Потерянные сообщения между процессами PVM? - PullRequest
0 голосов
/ 10 ноября 2010

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

Ни одна из функций pvm (в ведущем или любом дочернем процессе)возвращают любые коды ошибок, дети, кажется, успешно завершены, ошибки не достигают консоли.Это действительно выглядит так, будто мастер не получает все сообщения от детей - но только изредка.

Как ни странно, я не думаю, что это просто пропускает сообщение - мне еще предстоиту ребенка отсутствует результат, который затем успешно отправляется по полному сигналу (то есть у меня не было завершения выполнения, и он возвращает неожиданный результат) - как будто ребенок просто отключается, и все сообщения отопределенная точка перестает поступать.

Пакетирование результатов и отправка меньших, но более крупных сообщений кажется для повышения надежности, по крайней мере кажется, что оно торчит реже - у меня нет трудностейцифры, подтверждающие это ...

Это нормально, распространено или ожидается, что PVM потеряет сообщения, отправленные через pvm_send и его друзей? Обратите внимание, что ошибка происходит, если все процессы выполняютсяна одном или нескольких хостах.

Я что-то не так делаю?Могу ли я что-нибудь сделать, чтобы предотвратить это?

Обновление

Я воспроизвел ошибку в очень простом тестовом примере, код которого приведен ниже, в результате которого четверо детей отправляют одно числокаждый, каждый ребенок умножает полученное число на пять и отправляет его обратно.Он работает почти все время, но иногда мы замираем, когда распечатываются только три числа - результат одного ребенка отсутствует (а указанный ребенок будет завершен).

Мастер:

int main()
{
    pvm_start_pvmd( 0 , NULL , 0 );

    int taskIDs[global::taskCount];
    pvm_spawn( "/path/to/pvmtest/child" , NULL , 0 , NULL , global::taskCount , taskIDs );

    int numbers[constant::taskCount] = { 5 , 10 , 15 , 20 };
    for( int i=0 ; i<constant::taskCount ; ++i )
    {
        pvm_initsend( 0 );
        pvm_pkint( &numbers[i] , 1 , 1 );
        pvm_send( taskIDs[i] , 0 );
    }

    int received;
    for( int i=0 ; i<global::taskCount ; ++i )
    {
        pvm_recv( -1 , -1 );
        pvm_upkint( &received , 1 , 1 );
        std::cout << recieved << std::endl;
    }

    pvm_halt();
}

Ребенок:

int main()
{
    int number;

    pvm_recv( -1 , -1 );
    pvm_upkint( &number , 1 , 1 );

    number *= 10;

    pvm_initsend( 0 );
    pvm_pkint( &number , 1 , 1 );
    pvm_send( pvm_parent() , 0 );
}

1 Ответ

0 голосов
/ 23 ноября 2010

Не совсем ответ, но две вещи изменились вместе, и проблема, похоже, утихла:

  1. Я добавил pvm_exit() вызов конца ведомого двоичного файла, которыйпо-видимому, лучше всего это сделать.

  2. Конфигурация PVM в кластере изменилась ... каким-то образом ... У меня нет никаких подробностей, но несколько узлов ранее не могли взятьУчаствовать в PVM-операциях и теперь могу.Другие вещи, возможно, также изменились.

Я подозреваю, что кое-что в пределах второго изменения также случилось, чтобы решить мою проблему.

...