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

时间:2013-11-05 09:48:25

标签: 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&gt; 4> 1。

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

我无法弄明白。

1 个答案:

答案 0 :(得分:1)

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

您的问题也可能太小,使用并行处理的开销会克服其优势。如果是这种情况,运行具有更大矩阵的4个进程最终将比1和2进程版本更高效。