MPI_Barrier не работи правилно в Ubuntu

Аз съм начинаещ в използването на MPI. Тук написах много проста програма, за да тествам дали MPI може да работи. Ето моето hello.c:

#include <stdio.h>
#include <mpi.h>

int main(int argc, char *argv[]) {
  int numprocs, rank, namelen;
  char processor_name[MPI_MAX_PROCESSOR_NAME];

  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Get_processor_name(processor_name, &namelen);
  MPI_Barrier(MPI_COMM_WORLD);
  printf("Process %d on %s out of %d\n", rank, processor_name, numprocs);

  MPI_Finalize();
}

Използвам възел за тестване, хост файлът е: node1 node2

Така че имам две машини с име node1 и node2. Мога да се свързвам един с друг без парола.

Стартирам програмата, като напиша: mpirun -np 2 -f hostfile ./hello.

Изпълнимият hello е в една и съща директория и на двете машини.

След това, след като стартирам, получавам грешка:

Фатална грешка в PMPI_Barrier: Друга MPI грешка, стек грешки: PMPI_Barrier(425).........: MPI_Barrier(MPI_COMM_WORLD) неуспешно MPIR_Barrier_impl(331)....: Неуспех по време на колективен MPIR_Barrier_impl(313)... .: MPIR_Barrier_intra(83)....: dequeue_and_set_error(596): Комуникационна грешка с ранг 0 Фатална грешка в PMPI_Barrier: Друга MPI грешка, грешка стек: PMPI_Barrier(425).........: MPI_Barrier(MPI_COMM_WORLD ) неуспешно MPIR_Barrier_impl(331)....: Грешка по време на колективен MPIR_Barrier_impl(313)....: MPIR_Barrier_intra(83)....: dequeue_and_set_error(596): Комуникационна грешка с ранг 1

Ако коментирам MPI_Barrier(), той може да работи правилно. Изглежда, че комуникацията между машините има проблем? Или не съм инсталирал правилно openmpi? Някакви идеи?

Използвам Ubuntu 12.10

Получих някои съвети: Това не работи добре в MPICH2, ако използвам openmpi, тогава работи. Инсталирах MPICH само чрез sudo apt-get install mpich2. пропускам ли нещо Размерът на mpich2 е много по-малък от openmpi


mpi
person Yan Li    schedule 13.04.2013    source източник
comment
1) Имената на компютрите в hostfile трябва да са на отделни редове, така ли е? 2) Какъв е изходът на програмата, ако коментирате реда MPI_Barrier? 3) Как компилирахте програмата?   -  person zonksoft    schedule 13.04.2013
comment
stackoverflow .com/questions/12854879/ това звучи свързано   -  person zonksoft    schedule 13.04.2013
comment
@RafaelReiter е прав; това обикновено е проблем с конфигурацията. Необходим е ssh без парола между двата възела, но MPI обикновено също изискват широк набор от портове, за да бъдат отворени, така че проверете всички защитни стени, правила за iptables и т.н.: wiki.mpich.org/mpich/index.php/   -  person Jonathan Dursi    schedule 13.04.2013
comment
Мога да използвам тази програма, като използвам openmpi, така че определено няма нищо с мрежата. Моят хост файл е в отделни редове.   -  person Yan Li    schedule 13.04.2013
comment
Компилирам от mpicc -o hello hello.c   -  person Yan Li    schedule 13.04.2013
comment
Ако коментирам този ред, той ще изведе правилния ранг   -  person Yan Li    schedule 13.04.2013
comment

Боря се да получа това, което очаквам да видя, когато правя заявка към масив с помощта на Mongoose. Един потребител може да има много стаи, свързани с неговия/нейния акаунт. Стайните обекти се съхраняват в масив, прикрепен към потребителя в колекцията. Има само една колекция, наречена потребители.

Обмислете следните две схеми за потребител и стая:

ПОТРЕБИТЕЛСКА СХЕМА

var userSchema = mongoose.Schema({

local            : {
    username     : String,
    email        : String,
    password     : String,
    rooms        : {type:Array, default: []}
}  


});

СХЕМА НА СТАЯТА

var roomSchema = mongoose.Schema({

     name: String

});

Това е заявката, която опитах:

var User = require('../models/user');

User.find({ 'rooms.name' : req.body.username  }, 
            { rooms: 
                { $elemMatch : 
                   { 
                     name: req.body.username 
                   } 
                } 
            }, function (err, user) {

        if (err){
            return done(err);
        }    

        console.log("user:::", user);

        if (user) {
            console.log("ROOM NAME FOUND");
            req.roomNameAlreadyInUse = true;
            next();

        } else {
            req.roomNameAlreadyInUse = false;
            console.log("ROOM NAME NOT FOUND");
            next();

        }

    });

Проблемът е, че тази заявка изглежда винаги връща празен масив, дори ако трябва да съдържа нещо или ако не трябва да връща нищо. И така, как да търся във всички потребителски масиви от стаи, за да видя дали името на стаята вече съществува?

Опитах и ​​следните запитвания, но нито едно не беше успешно:

User.find({local: {rooms: {$elemMatch: {name: req.body.username}}}}, function (err,     user) {

}



User.find({'local.rooms': {$elemMatch: {name: req.body.username}}}, function (err, user) {

}

Трябва също така да отбележа, че базата данни е попълнена, тъй като мога да видя масива (който има 1 елемент, създаден при създаването на потребителски акаунт) в robomongo.

Примерни данни от изхода на конзолата, за да се покаже, че базата данни се попълва (включително масив user.rooms):

db.users.find() { "_id" : ObjectId("533c4db2b2c311a81be8a256"), "local" : { "парола" : "$2a$08$0yQQJ2y0726kZtkWY5mAPOgZhacOmZn0Fd8DlausiuMB XE4ZblTXS", "потребителско име" : " паул", "имейл": " test", "rooms" : [ { "name" : "paul", "id" : ObjectId("533c4db2b2c311a81be8a2 57") } ], "status" : "active" }, "_v" : 0 } { "_id" : ObjectId("533c4ddab2c311a81be8a258"), "local" : { "password" : "$2a$08$dC3CbDTkG5ozECDTu/IicO3Az0WdkzlGh2xDcb8j1CF/ FQhe5guZq", "username" : "john", "e поща" : "тест2 ", "rooms" : [ { "name" : "john", "id" : ObjectId("533c4ddab2c311a81be8a 259") } ], "status" : "active" }, "_v" : 0}

  -  person Yan Li    schedule 14.04.2013


Отговори (1)


В /etc/hosts по-новите версии на някои Linux дистрибуции добавят следните типове редове в горната част на файла:

127.0.0.1 localhost
127.0.0.1 [hostname]

Това трябва да се промени, така че редът с името на хоста да съдържа вашия действителен IP адрес. Процесът MPI hydra ще прекъсне, ако не направите тази промяна с грешки като:

Fatal error in PMPI_Barrier: Other MPI error, error stack:
PMPI_Barrier(425)...........: MPI_Barrier(MPI_COMM_WORLD) failed
MPIR_Barrier_impl(292)......: 
MPIR_Barrier_or_coll_fn(121): 
MPIR_Barrier_intra(83)......: 
dequeue_and_set_error(596)..: Communication error with rank 0
person Javaxtreme    schedule 27.06.2014