c - 四个进程执行速度比两个进程慢

标签 c linux parallel-processing

我想比较使用不同过程(1、2、4)的矩阵乘法

我使用 2 个进程的代码,fork 一次,让 child 成为父进程并进行 1/2 计算

  if (cpid == 0) {            /* Code executed by child */
      for (int i = 0; i < dimension / 2; i++)
      {
        for (int j = 0; j < dimension; j++)
        {
          //matrix multiplication
        }
      }
      exit(EXIT_SUCCESS);
  } else {                    /* Code executed by parent */
        for (int i = dimension / 2; i < dimension; i++)
        {
              for (int j = 0; j < dimension; j++)
              {
          //matrix multiplication                    
              }
        }
  }

和4个进程的代码,fork一次,然后child和parent再次fork, 用4进程做1/4计算

 cpid = fork();
  if (cpid == 0)
  {
      cpid = fork();
      if (cpid == 0)
      {
              for (int i = 0; i < dimension / 2; i++)
              {
                for (int j = 0; j < dimension / 2; j++)
                {
                  //matrix multiplication
                }
              }
        exit(EXIT_SUCCESS);
      }
      else{
              for (int i = 0; i < dimension / 2; i++)
              {
                for (int j = dimension / 2; j < dimension; j++)
                {
                  //matrix multiplication
                }
              }
        exit(EXIT_SUCCESS);
      }
  }
  else{
      cpid = fork();
      if (cpid == 0)
      {
              for (int i = dimension / 2; i < dimension; i++)
              {
                for (int j = 0; j < dimension / 2; j++)
                {
                  //matrix multiplication
                }
              }
        exit(EXIT_SUCCESS);
      }
      else{
              for (int i = dimension / 2; i < dimension; i++)
              {
                for (int j = dimension / 2; j < dimension; j++)
                {
                  //matrix multiplication
                }
              }
      }      
  }

完整代码是:http://codepad.org/MmjRiBIN

令我惊讶的是速度是 2 > 4 > 1 。

1
elapsed 5147.936000 ms
2
elapsed 2821.225000 ms
4
elapsed 3129.096000 ms

我想不通。

最佳答案

我会说你在双核上运行。
仅当您有核心来处理每个流程时,将工作负载拆分到各个流程才会有所帮助。
否则,处理器内核将花费时间切换进程上下文,而不是处理任务本身。

您的问题也可能太小,使用并行处理的开销超过了它的好处。如果是这种情况,运行 4 个具有更大矩阵的进程最终将比 1 和 2 个进程版本的性能更高。

关于c - 四个进程执行速度比两个进程慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19785947/

相关文章:

在 c 中创建 Pascal 三角形

linux - UDP 吞吐量 : Decreasing InterruptThrottleRate in ethernet adapter e1000e.

python - 按标题查找 xterm 窗口,使用 python/bash 输入一个命令并按回车键

C++,如何在非并行任务中通过线程准确划分cpu工作

c - memcpy 的疑问。需要澄清

关于 sprintf 函数如何在 C 中工作的困惑

c++ - 学习 c/c++ 图像处理的好地方?

linux - 列出 Linux 中包含 *.pdf 文件的所有目录并将结果通过管道传输到文件

Python/多处理 : Processes does not seem to start

matlab - 控制 Matlab 工作人员或实验室