[MPICH] Help with a problematic simple MPI application that creates directories

Clements, Brent bclements at SBSPlanet.com
Wed Sep 27 22:21:27 CDT 2006


That worked for a bit, but when I passed the same thing to mkdir I get a
-1 failure.

My code is a bit huge for a what I want to do.

Does any one have a simple example that shows how individual mpi slaves
can create their own directories with their rank in the directory name?

I have a $25.00 thinkgeek for anyone that can help.

I'm trying to learn what I'm doing wrong and my code seems to have to
many bugs to be a good learning tool

Thanks,
BC

-----Original Message-----
From: Syed Irfan [mailto:irfan at itee.uq.edu.au] 
Sent: Wednesday, September 27, 2006 4:27 PM
To: Clements, Brent
Subject: Re: [MPICH] Help with a problematic simple MPI application that
creates directories

Hi,

basedir is a char * so you need to allocate memory. There is no common 
memory allocation for basedir in child/slave process, but you are 
assigning it to "/tmp". And that should be strcpy(basedir, "/tmp")

hth
Irfan

Clements, Brent wrote:
>
> Ok, the goal of the mpi application is to take 3 arguments.... -a
NUMBER 
> of Directories to create -b the number of files to create in each 
> directory -c the /basedir to use as the directory creation point.
>
> I have written this mpi application and I'm at a point where I'm 
> trying to debug why the individual slave mpi processes aren't actually

> performing the mkdir.
>
> I've attached the source to this email if someone wouldn't mind taking

> a peek and seeing what I'm doing wrong.
>
> To compile just type
>
> Mpicc -DDEBUG test4.c -o test4
>
> To run the app just do mpirun -np 3 ./test4 -a 3 -c /tmp
>
> The arguments don't really do anything yet(but you need them to run 
> the app), since in the code I have some hard coded values.
>
> My problem is the "mkdir" part of the code...it never makes the
directory
>
> I'd appreciate anyones help with this!!
>
> I have a $25.00 gift certificate to Thinkgeek to anyone that can help 
> me out and point out my probably stupid mistake.
>
> Btw, don't snicker, YES THE CODE IS BAD, I just need something as a 
> proof of concept for my relearning of MPI and I've been fighting this 
> thing for the past 2 hours.
>
> Thanks,
>
> BC
>
> SOURCE CODE BELOW:
>
> #include <stdio.h> /* all IO stuff lives here */
>
> #include <stdlib.h> /* exit lives here */
>
> #include <unistd.h> /* getopt lives here */
>
> #include <errno.h> /* UNIX error handling lives here */
>
> #include <string.h> /* strcpy lives here */
>
> #include <mpi.h> /* MPI and MPI-IO live here */
>
> #include <sys/stat.h>
>
> #define MASTER_RANK 0
>
> #define TRUE 1
>
> #define FALSE 0
>
> #define BOOLEAN int
>
> int main( argc, argv )
>
> int argc;
>
> char * argv [];
>
> {
>
> /* my variables */
>
> int my_rank, i, numdirs, numfiles, pool_size;
>
> BOOLEAN i_am_the_master = FALSE, input_error = FALSE;
>
> char * basedir;
>
> char * dir_name = NULL;
>
> char rankdirname[300];
>
> /* getopt variables */
>
> extern char* optarg;
>
> int c;
>
> /* error handling variables */
>
> extern int errno;
>
> /* ACTION */
>
> MPI_Init(&argc, &argv);
>
> MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
>
> MPI_Comm_size(MPI_COMM_WORLD, &pool_size);
>
> if (my_rank == MASTER_RANK)
>
> i_am_the_master = TRUE;
>
> if (i_am_the_master)
>
> {
>
> /* read the command line */
>
> while ((c = getopt(argc, argv, "a:b:c:")) != -1)
>
> switch( c )
>
> {
>
> case 'a':
>
> numdirs = atoi(optarg);
>
> break;
>
> case 'b':
>
> numfiles = atoi(optarg);
>
> break;
>
> case 'c':
>
> basedir = optarg;
>
> break;
>
> case '?':
>
> return 1;
>
> default:
>
> abort();
>
> }
>
> #ifdef DEBUG
>
> printf("basedirname = %s\n", basedir);
>
> printf("number_of_directorys = %d\n", numdirs);
>
> #endif
>
> } /* end of if(i_am_the_master) { <read the command line> } */
>
> /* Transmit the effect of reading the command line to other
>
> processes. */
>
> /* If we managed to get here, data read from the command line
>
> is probably OK. */
>
> MPI_Bcast(&basedir, sizeof(basedir), MPI_CHAR, MASTER_RANK, 
> MPI_COMM_WORLD);
>
> MPI_Bcast(&numdirs, 1, MPI_INT, MASTER_RANK, MPI_COMM_WORLD);
>
> if (!i_am_the_master)
>
> {
>
> /* Now every process creates its own directory based upon its own rank
*/
>
> /* PROBLEMATIC CODE */
>
> basedir = "/tmp";
>
> // Create this processes directory name based upon it's rank
>
> sprintf(rankdirname, "RANK%d", my_rank);
>
> // Change to the base dir /tmp
>
> chdir(basedir);
>
> // make the directory
>
> mkdir(rankdirname, S_IRWXU);
>
> printf("Creating Directory: %s/%s\n", basedir, rankdirname);
>
> /* PROBLEMATIC CODE */
>
> printf("number_of_directorys = %d\n", numdirs);
>
> printf("MY RANK = %d\n", my_rank);
>
> }
>
> else
>
> {
>
> printf("MY RANK = %d\n", my_rank);
>
> }
>
> MPI_Finalize();
>
> exit(0);
>
> }
>
> The information contained in this transmission may contain privileged
and confidential information. 
> It is intended only for the use of the person(s) named above. If you
are not the intended  
> recipient, you are hereby notified that any review, dissemination,
distribution or  
> duplication of this communication is strictly prohibited. If you are
not the intended recipient, 
> please contact the sender by reply email and destroy all copies of the
original message. 
> To reply to our email administrator directly, please send an email to
postmaster at sbsplanet.com.




The information contained in this transmission may contain privileged and confidential information. 
It is intended only for the use of the person(s) named above. If you are not the intended  
recipient, you are hereby notified that any review, dissemination, distribution or  
duplication of this communication is strictly prohibited. If you are not the intended recipient, 
please contact the sender by reply email and destroy all copies of the original message. 
To reply to our email administrator directly, please send an email to postmaster at sbsplanet.com.




More information about the mpich-discuss mailing list