умножение 2-х мерных массивов с помощью fork () - PullRequest
0 голосов
/ 14 марта 2012

Я пытаюсь умножить a [2] [3] на b [3] [4] и поместить ответ в c [2] [4]. Я должен использовать fork () и сделать 2 процесса, каждый дочерний элемент для c [0] [j] и c [1] [j], родитель будет ждать. Таким образом, каждый дочерний процесс будет вычислять строку для c. Это мой код:

//multiply a[2][3] * b[3][4] = c[2][4]
//with fork
//each child completes one c[2][4]'s row
#include<stdio.h>
#include<stdlib.h>

main()
{
  int a[2][3]={1,2,3, 
           4,5,6};
  int b[3][4]={1,2,3,4,
           5,6,7,8,
           9,10,11,12};
  int c[2][4];
      int i,j;
  int m;    //for the calculation
  int n;    //common 3
  int pid;  //fork

  for(i=0;i<2;i++)
  {
    pid=fork();
    if(pid==-1)
    {
      printf("Can't fork\n");
    }
    if(pid==0)//child
    {
      for(j=0;j<4;j++)
      {
    for(n=0;n<3;n++)
    {
      m=m+a[i][n]*b[n][j];
    }
    c[i][j]=m;
    m=0;
      }
      exit(EXIT_SUCCESS);
    }
    if(pid>0)//parent
    {
      wait(0);
    }
  }
  printf("C:\n");
  for(i=0;i<2;i++)
  {
    for(j=0;j<4;j++)
    {
      printf("%d\t",c[i][j]);
    }
    printf("\n");
  }        
}

У меня нет ошибок при компиляции, но я получаю неправильные числа ... неуклюжие большие числа ... Есть идеи?

1 Ответ

0 голосов
/ 14 марта 2012

В: У меня нет ошибок при компиляции, но я получаю неправильные числа ... неуклюжие большие числа ... Есть идеи?

A: Да - в тот момент, когда вы раскошелитесь,у вас есть два разных процесса с двумя совершенно независимыми адресными пространствами:)

Одно хорошее решение - использовать потоки вместо fork ():

https://computing.llnl.gov/tutorials/pthreads/

...