C分支的问题,错误的结果,可能是共享内存



我有一个分配做一个矩阵乘法与叉,使用共享内存,然后比较时间结果与乘法没有叉,所以这里是乘法没有他们:

int matrizA[Am][An];
int matrizB[An][Bp];
//here i fill the matrix from a .txt file
int matrizR[Am][Bp];
int a,b,c;
for (a=0; a < Am; a++){
    for (b = 0; b < Bp; b++)
    {
        matrizR[a][b] = 0;
        for (c=0; c<An; c++){
            matrizR[a][b] += matrizA[a][c] * matrizB[c][b]; 
        }
    }
}

然后我尝试实现分叉,但结果是错误的,我不确定我是否必须实现共享内存和在哪里,是matrizA, matrizB和matrizR2应该共享?我该怎么做呢?

int matrizR2[Am][Bp];
pid_t pids[Am][Bp];
int h,j;
/* Start children. */TY
for (h = 0; h < Am; ++h) {
    for (j=0; j<Bp ; ++j){
      if ((pids[h][j] = fork()) < 0) {
        perror("fork");
        abort();
      } else if (pids[h][j] == 0) {
        matrizR2[h][j] = 0;
        for (c=0; c<An; c++){
            matrizR2[h][j] += matrizA[h][c] * matrizB[c][j]; 
        }
        printf("im fork %d,%dn",h,j);
        exit(0);
      }
    }
}
/* Wait for children to exit. */
int status;
pid_t pid;
while (n > 0) {
  pid = wait(&status);
  --n; 
}

没有给出一个完整的解决方案,因为这是一个家庭作业,但是这里有用于在Unix上获得共享内存的函数的文档:http://pubs.opengroup.org/onlinepubs/009695399/functions/shmget.html

你会调用shmget(),然后在每个子进程中传递给shmat()的标识符,以获得一个指向共享内存的指针。

另一种方法是让每个进程在管道中传回其结果,并复制它们,但这样会慢得多。另一种方法是使用线程而不是进程,因为线程共享内存。另一个是传递信息。另一个是内存映射文件。但是,将共享内存转换为指向结构体的指针是最简单的方法,并且具有最佳性能。

最后,如果要写入相同的共享内存,则需要注意不要让两个进程写入相同的内存。如果每行打开一个进程,并且行正确对齐,应该不会有问题,但安全的方法是使用锁或原子变量。

最新更新