I am new to open MPI
I have a simple program below:
#include <iostream>
#include <pthread.h>
#include "mpi.h"
using namespace std;
void* backID(void* arg)
{
int myid;
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
cout << myid << " create background ID" << endl;
int v;
MPI_Status status;
int m;
int x, y;
int count = 0;
while(true)
{
MPI_Recv(&m, 1, MPI_INT, MPI_ANY_SOURCE, 222, MPI_COMM_WORLD, &status);
cout << myid << " recv from " << status.MPI_SOURCE << " m = " << m << " with tag 222" << endl;
MPI_Send(&m, 1, MPI_INT, status.MPI_SOURCE, 333, MPI_COMM_WORLD);
cout << myid << " replies " << status.MPI_SOURCE << " m = " << m << endl;
count++;
if(count == 50)
{
pthread_exit(NULL);
}
};
}
void* backRecv(void* arg)
{
int myid;
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
cout << myid << " create background message recv" << endl;
int x, y;
MPI_Status status;
int m;
int count = 0;
while(true)
{
MPI_Recv(&m, 1, MPI_INT, MPI_ANY_SOURCE, 333, MPI_COMM_WORLD, &status);
cout << myid << " recv from " << status.MPI_SOURCE << " m = " << m << " with tag 333" << endl;
count++;
if(count == 50)
{
pthread_exit(NULL);
}
};
}
int main(int argc, char **argv)
{
int myid = 0;
int nprocs = 0;
pthread_t pt1 = 0;
pthread_t pt2 = 0;;
int pret1 = 0;
int pret2 = 0;
int i = 0, j = 0, t = 0;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&nprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
pret1 = pthread_create(&pt1, NULL, backRecv, NULL);
if(pret1 != 0)
{
cout << myid << "backRecv Thread Create Failed." << endl;
exit(1);
}
pret2 = pthread_create(&pt2, NULL, backID, NULL);
if(pret2 != 0)
{
cout << myid << "backID Thread Create Failed." << endl;
exit(1);
}
sleep(5);
for(i=0; i<50; ++i)
{
t = (myid + 1) * i;
MPI_Send(&myid, 1, MPI_INT, (myid+1)%nprocs, 222, MPI_COMM_WORLD);
cout << myid << " sends to "<< (myid+1)%nprocs << " " << myid << endl;
}
pthread_join(pt1, NULL);
pthread_join(pt2, NULL);
MPI_Finalize();
}
I create two sub-threads in each main thread and want to see if they can work as a background receiver. But when I run it I got segmentation fault. I do not know why. If I only create one thread, it works fine. The error message I got is:
#0 0x00002b5d3c80a940 in mca_btl_sm_alloc () from /act/openmpi/gnu/lib/openmpi/mca_btl_sm.so
(gdb) bt
#0 0x00002b5d3c80a940 in mca_btl_sm_alloc () from /act/openmpi/gnu/lib/openmpi/mca_btl_sm.so
#1 0x00002b5d3bbb91ca in mca_pml_ob1_send_request_start_copy () from /act/openmpi/gnu/lib/openmpi/mca_pml_ob1.so
#2 0x00002b5d3bbadc86 in mca_pml_ob1_send () from /act/openmpi/gnu/lib/openmpi/mca_pml_ob1.so
#3 0x00002b5d3945571d in PMPI_Send () from /act/openmpi/gnu/lib/libmpi.so.0
#4 0x0000000000409139 in main (argc=1, argv=0x7fff718e4db8) at ptest.cpp:125
This message is from gdb.
Any help will be appreciated.
Thanks in advance.
vincent
_________________________________________________________________
Ô¼»á˵²»Ç嵨·½£¿À´ÊÔÊÔ΢ÈíµØÍ¼×îÐÂmsn»¥¶¯¹¦ÄÜ£¡
http://ditu.live.com/?form=TL&swm=1
|