Solved

matrix addition using shared memory

Posted on 2010-11-23
4
1,075 Views
Last Modified: 2012-05-10
I want to add 2 matrices using shared memory and parallel processes, in linux, but my code doesnt run correctly .
Where is the problem?
#include <stdio.h>

#include <sys/shm.h>

#include <sys/stat.h>

#include <stdlib.h>



int main ()

{



int idA,idB,idC, child_id;

int *A,*B, *C;//the 3 arrays

int* child_memory;

int *pA, *pB, *pC;

const int size = 4096;

int i;

//allocate shared memory for an array of 5 integers

idA = shmget(IPC_PRIVATE, 5*sizeof(int), S_IRUSR | S_IWUSR);

idB = shmget(IPC_PRIVATE, 5*sizeof(int), S_IRUSR | S_IWUSR);

idC = shmget(IPC_PRIVATE, 5*sizeof(int), S_IRUSR | S_IWUSR);



//attach shared memory to parent

A = (int *) shmat(idA, NULL, 0);

B = (int *) shmat(idB, NULL, 0);

C = (int *) shmat(idC, NULL, 0);

for(i=0; i<5; i++){

         A[i]=1;

         B[i]=2;

         C[i]=0;

         }

for (i=0; i<5; i++){

    printf("A[%d]=%d B[%d]=%d  C[%d]=%d\n",i,A[i],i,B[i],i,C[i]);

}

printf("\n"); 

for(i=0;i<5; i++){

   child_id=fork();

   if (child_id==0){

       A = (int*) shmat(idA, NULL, 0);

       B = (int*) shmat(idB, NULL, 0);

       C = (int*) shmat(idC, NULL, 0);             

       C[i] = A[i] + B[i];

       

   }

   else if (child_id>0){

    wait(0);

        

   }

   else {perror("fork");exit(1);}

}   

printf("C[%d] = %d ", i,C[i]);       



shmdt(A);shmdt(B);shmdt(C);



shmctl(idA, IPC_RMID, NULL);

shmctl(idB, IPC_RMID, NULL);

shmctl(idC, IPC_RMID, NULL);

return 0;

}

Open in new window

0
Comment
Question by:dimi67
  • 2
  • 2
4 Comments
 
LVL 53

Expert Comment

by:Infinity08
ID: 34196336
Could you elaborate a bit on how it doesn't run correctly ? What do you observe ? What did you expect instead ?
0
 

Author Comment

by:dimi67
ID: 34197385
.if you run the code you will see that t values of array C don't change at all...
0
 
LVL 53

Accepted Solution

by:
Infinity08 earned 500 total points
ID: 34197828
>> printf("C[%d] = %d ", i,C[ i]);  

At this point, i = 5. That'll show an out-of-range value from the array. You probably intended to put this in a loop for i from 0 to 4.

You probably also want to end the children (ie. exit) once they've done their job.

And you probably also want to let the parent wait until the children have done their job.
0
 

Author Closing Comment

by:dimi67
ID: 34198875
ok men, I fixed it with exit(0) at the end of the child...
0

Featured Post

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Ubuntu Apache Webserver - File Permissions 5 59
error log using ftp 7 56
centos commands 6 69
Samba Question 11 80
If you have a server on collocation with the super-fast CPU, that doesn't mean that you get it running at full power. Here is a preamble. When doing inventory of Linux servers, that I'm administering, I've found that some of them are running on l…
Little introduction about CP: CP is a command on linux that use to copy files and folder from one location to another location. Example usage of CP as follow: cp /myfoder /pathto/destination/folder/ cp abc.tar.gz /pathto/destination/folder/ab…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use while-loops in the C programming language.
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

821 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question