Try malloc'ing your array instead of creating it statically on the stack.  
Something like:

int *data;

int main(..) {
{
    data = malloc(ARRAYSIZE * sizeof(int));
    if (NULL == data) {
        perror("malloc");
        exit(1);
    }
    // ...
}


On Apr 17, 2012, at 5:05 AM, Rohan Deshpande wrote:

> 
> Hi, 
> 
> I am trying to distribute large amount of data using MPI. 
> 
> When I exceed the certain data size the segmentation fault occurs. 
> 
> Here is my code, 
>    
>      
> #include "mpi.h" 
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h> 
> #define  ARRAYSIZE    2000000 
> #define  MASTER        0 
>  
> int  data[ARRAYSIZE];
>  
>  
> int main(int argc, char* argv[])
> { 
> int   numtasks, taskid, rc, dest, offset, i, j, tag1, tag2, source, 
> chunksize, namelen;  
> int mysum, sum; 
> int update(int myoffset, int chunk, int myid);
> char myname[MPI_MAX_PROCESSOR_NAME]; 
> MPI_Status status;
> double start, stop, time;
> double totaltime;
> FILE *fp;
> char line[128];
> char element;
> int n;
> int k=0;
> 
>  
>  
> /***** Initializations *****/ 
> MPI_Init(&argc, &argv); 
> MPI_Comm_size(MPI_COMM_WORLD, &numtasks); 
> MPI_Comm_rank(MPI_COMM_WORLD,&taskid); 
> MPI_Get_processor_name(myname, &namelen); 
> printf ("MPI task %d has started on host %s...\n", taskid, myname); 
> chunksize = (ARRAYSIZE / numtasks); 
> tag2 = 1; 
> tag1 = 2;
>  
>  
> /***** Master task only ******/ 
> if (taskid == MASTER){
> 
>    /* Initialize the array */ 
>   sum = 0; 
>   for(i=0; i<ARRAYSIZE; i++) { 
>     data[i] =  i * 1 ; 
>     sum = sum + data[i]; 
>     } 
>   printf("Initialized array sum = %d\n",sum); 
>  
>   /* Send each task its portion of the array - master keeps 1st part */ 
>   offset = chunksize; 
>   for (dest=1; dest<numtasks; dest++) { 
>     MPI_Send(&offset, 1, MPI_INT, dest, tag1, MPI_COMM_WORLD); 
>     MPI_Send(&data[offset], chunksize, MPI_INT, dest, tag2, MPI_COMM_WORLD); 
>     printf("Sent %d elements to task %d offset= %d\n",chunksize,dest,offset); 
>     offset = offset + chunksize; 
>     } 
>  
>   /* Master does its part of the work */ 
>   offset = 0; 
>   mysum = update(offset, chunksize, taskid); 
>  
>   /* Wait to receive results from each task */ 
>   for (i=1; i<numtasks; i++) { 
>     source = i; 
>     MPI_Recv(&offset, 1, MPI_INT, source, tag1, MPI_COMM_WORLD, &status); 
>     MPI_Recv(&data[offset], chunksize, MPI_INT, source, tag2, 
>       MPI_COMM_WORLD, &status); 
>     } 
>  
>   /* Get final sum and print sample results */   
>   MPI_Reduce(&mysum, &sum, 1, MPI_INT, MPI_SUM, MASTER, MPI_COMM_WORLD); 
>  /* printf("Sample results: \n"); 
>   offset = 0; 
>   for (i=0; i<numtasks; i++) { 
>     for (j=0; j<5; j++)  
>       printf("  %d",data[offset+j]);ARRAYSIZE 
>     printf("\n"); 
>     offset = offset + chunksize; 
>     }*/ 
>   printf("\n*** Final sum= %d ***\n",sum); 
>  
>   }  /* end of master section */ 
>  
>  
> #include <stdlib.h> 
> /***** Non-master tasks only *****/ 
>  
> if (taskid > MASTER) { 
>  
>   /* Receive my portion of array from the master task */
>   start= MPI_Wtime(); 
>   source = MASTER; 
>   MPI_Recv(&offset, 1, MPI_INT, source, tag1, MPI_COMM_WORLD, &status); 
>   MPI_Recv(&data[offset], chunksize, MPI_INT, source, tag2,MPI_COMM_WORLD, 
> &status);
>  
>   mysum = update(offset, chunksize, taskid);
>   stop = MPI_Wtime();
>   time = stop -start;
>   printf("time taken by process %d to recieve elements and caluclate own sum 
> is = %lf seconds \n", taskid, time);
>   totaltime = totaltime + time; 
>  
>   /* Send my results back to the master task */ 
>   dest = MASTER; 
>   MPI_Send(&offset, 1, MPI_INT, dest, tag1, MPI_COMM_WORLD); 
>   MPI_Send(&data[offset], chunksize, MPI_INT, MASTER, tag2, MPI_COMM_WORLD); 
>  
>   MPI_Reduce(&mysum, &sum, 1, MPI_INT, MPI_SUM, MASTER, MPI_COMM_WORLD); 
>  
>   } /* end of non-master */ 
>  
> // printf("Total time taken for distribution is -  %lf  seconds", totaltime); 
> MPI_Finalize(); 
>  
> }   /* end of main */ 
>  
>  
> int update(int myoffset, int chunk, int myid) { 
>   int i,j;  
>   int mysum;
>   int mydata[myoffset+chunk]; 
>   /* Perform addition to each of my array elements and keep my sum */ 
>   mysum = 0;
>  /*  printf("task %d has elements:",myid);
>   for(j = myoffset; j<myoffset+chunk; j++){
>       printf("\t%d", data[j]);
>   }
>  printf("\n");*/ 
>   for(i=myoffset; i < myoffset + chunk; i++) {
>      
>     //data[i] = data[i] + i; 
>     mysum = mysum + data[i]; 
>     } 
>   printf("Task %d has sum = %d\n",myid,mysum); 
>   return(mysum); 
> } 
> 
> 
> When I run it with ARRAYSIZE = 2000000 The program works fine. But when I 
> increase the size ARRAYSIZE = 20000000. The program ends with segmentation 
> fault.
> I am running it on a cluster (machine 4 is master, machine 5,6 are slaves)  
> and np=20
> 
> MPI task 0 has started on host machine4
> MPI task 2 has started on host machine4
> MPI task 3 has started on host machine4
> MPI task 14 has started on host machine4
> MPI task 8 has started on host machine6
> MPI task 10 has started on host machine6
> MPI task 13 has started on host machine4
> MPI task 4 has started on host machine5
> MPI task 6 has started on host machine5
> MPI task 7 has started on host machine5
> MPI task 16 has started on host machine5
> MPI task 11 has started on host machine6
> MPI task 12 has started on host machine4
> MPI task 5 has started on hostmachine5
> MPI task 17 has started on host machine5
> MPI task 18 has started on host machine5
> MPI task 15 has started on host machine4
> MPI task 19 has started on host machine5
> MPI task 1 has started on host machine4
> MPI task 9 has started on host machine6
> Initialized array sum = 542894464
> Sent 1000000 elements to task 1 offset= 1000000
> Task 1 has sum = 1055913696
> time taken by process 1 to recieve elements and caluclate own sum is = 
> 0.249345 seconds 
> Sent 1000000 elements to task 2 offset= 2000000
> Sent 1000000 elements to task 3 offset= 3000000
> Task 2 has sum = 328533728
> time taken by process 2 to recieve elements and caluclate own sum is = 
> 0.274285 seconds 
> Sent 1000000 elements to task 4 offset= 4000000
> --------------------------------------------------------------------------
> mpirun noticed that process rank 3 with PID 5695 on node machine4 exited on 
> signal 11 (Segmentation fault).
> 
> Any idea what could be wrong here?
> 
>  
> -- 
> 
> Best Regards,
> 
> ROHAN DESHPANDE  
> 
> 
> 
> _______________________________________________
> users mailing list
> us...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/users


-- 
Jeff Squyres
jsquy...@cisco.com
For corporate legal information go to: 
http://www.cisco.com/web/about/doing_business/legal/cri/


Reply via email to