Solved

matrix addition using shared memory

Posted on 2010-11-23
4
1,086 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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

Tutorials alone can't teach real engineering

So we built better training tools.

-Hands-on Labs
-Instructor Mentoring
-Scenario-Based Tests
-Dedicated Cloud Servers

All at your fingertips. What are you waiting for?

Question has a verified solution.

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

Setting up Secure Ubuntu server on VMware 1.      Insert the Ubuntu Server distribution CD or attach the ISO of the CD which is in the “Datastore”. Note that it is important to install the x64 edition on servers, not the X86 editions. 2.      Power on th…
Have you ever been frustrated by having to click seven times in order to retrieve a small bit of information from the web, always the same seven clicks, scrolling down and down until you reach your target? When you know the benefits of the command l…
The goal of this video is to provide viewers with basic examples to understand and use pointers in the C programming language.
The goal of this video is to provide viewers with basic examples to understand how to create, access, and change arrays in the C programming language.

695 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