2012-02-24 3 views
0

Я работаю всю неделю, чтобы попытаться получить 3-х машинный кластер с крутящим моментом + mpich2. Мой план состоит в том, чтобы использовать его в качестве моей среды разработки и в конечном итоге запустить производственный код в EC2 или другом облаке. Поскольку это среда разработки, я просто использую некоторые запасные машины (2 64-разрядных, 1 32-разрядных, если это имеет значение). Машины используют различные дистрибутивы Ubuntu (maverick, hardy и karmic).MPICH2 Недостаточно памяти при отправке INT

Проблема, с которой я сталкиваюсь, заключается в том, что в простой тестовой программе send/recv я сделал вызов recv, который заканчивается из памяти, и я понятия не имею, почему. ~ 1,2 ГБ свободной памяти на машине с 1 int, отправляемым/выпущенным.

Heres код:

/* 
* A very simple send/recv program 
*/ 

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

#define MAXHOSTNAMELEN 64 

int main(int argc, char **argv) 
{ 
    int pid, from; 
    int nproc; 
    MPI_Status status; 
    int to_recv; 
    int to_send = 1; 
    char hostname[MAXHOSTNAMELEN]; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &nproc); 
    MPI_Comm_rank(MPI_COMM_WORLD, &pid); 

    gethostname(hostname, MAXHOSTNAMELEN); 
    printf("%d of %d:%s Checking in\n", pid, nproc, hostname); 

    if (pid == 0) { 
     MPI_Recv(&to_recv, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &status); 
     from = status.MPI_SOURCE; 
     printf("%d of %d:%s Recieved Value %d from %d\n", pid, nproc, hostname, to_recv, from); 

     MPI_Recv(&to_recv, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &status); 
     from = status.MPI_SOURCE; 
     printf("%d of %d:%s Recieved Value %d from %d\n", pid, nproc, hostname, to_recv, from); 
    } else { 
     MPI_Send(&to_send, 1, MPI_INT, 0, 0, MPI_COMM_WORLD); 
     printf("%d of %d:%s Sent value\n", pid, nproc, hostname); 
    } 

    MPI_Finalize(); 
    exit(0); 
} 

А вот выход:

0 of 3:master Checking in 
2 of 3:node1 Checking in 
1 of 3:node2 Checking in 
1 of 3:node2 Sent value 
Fatal error in MPI_Recv: Other MPI error, error stack: 
MPI_Recv(186)...........................: MPI_Recv(buf=0x7fff33bed040, count=1, MPI_INT, src=2, tag=0, MPI_COMM_WORLD, status=0x7fff33bed020) failed 
MPIDI_CH3I_Progress(402)................: 
MPID_nem_mpich2_blocking_recv(905)......: 
MPID_nem_tcp_connpoll(1838).............: 
state_commrdy_handler(1676).............: 
MPID_nem_tcp_recv_handler(1564).........: 
MPID_nem_handle_pkt(636)................: 
MPIDI_CH3_PktHandler_EagerShortSend(441): Out of memory 
Fatal error in MPI_Send: Other MPI error, error stack: 
MPI_Send(173)..............: MPI_Send(buf=0x7fff8ee5396c, count=1, MPI_INT, dest=0, tag=0, MPI_COMM_WORLD) failed 
MPID_nem_tcp_connpoll(1826): Communication error with rank 0: Connection refused 

Если есть любая необходимая информация, которую я не включаю, пожалуйста, дайте мне знать, и я добавлю его.

MPICH2 Версия: mpich2-1.4.1p1 составлен из источника на каждой машине
GCC версии:
мастер: 4.2.4
node1: 4.4.5
node2: 4.4.1

Кроме того, в случае, если это важно, node2 - это 32-разрядная машина. Заранее благодарю за любую помощь.

EDIT: Я запускал это на кластере, который я использовал в прошлом, который настроен и известен для работы, чтобы проверить код. Кажется, что код работает правильно, я считаю, что проблема, которую я вижу, связана с конфигурацией MPI в моем кластере разработки.

ответ

3

К сожалению, MPICH2 не поддерживает гетерогенные платформы. Вы могли бы создать MPICH2 и ваше приложение для 32-битного и запустить его на всех машинах.

Смежные вопросы