OpenMP和线程

时间:2016-10-11 00:35:08

标签: multithreading pthreads openmp primes

我刚刚进入学习OpenMP的阶段,所以请耐心等待。

我有工作代码,用于在argv [1]中获取指定数字下的素数,一个使用常规for循环和OpenMP。以下是我需要理解的以下问题:

(常规循环)

  1. 在使用常规for循环的文件中,为什么每个测试操作在逻辑上彼此独立,最多100个?像测试5和测试7逻辑独立。
  2. 这怎么会在100后变得不独立?与测试105一样,如何测试105是否可被7或9整除,而不是独立于5-division测试?
  3. (对于OpenMP循环)

    1. OpenMP和pthreading如何以不同的方式工作?pthread如何以不同的方式处理OpenMP的任务?
    2. 以下是代码。他们工作正常。 :

      //prime.c    
      #include <stdio.h>
      
      int main(int argc, char *argv[]){
      
          int candidate = atoi(argv[1]);
          int prime = 1;
          int h = 1;
      
          for (h; h < candidate; h++){
              if (h > 3){
                  if (h % 2 == 0) continue;
                  else {
                      prime = 1;
                      int i = 3;
                      for (i; i*i <= h; i+=2){
                          if (h % i == 0){
                              prime = 0;
                              break;
                          }
                      }
      
                      // if (prime != 0) printf("Number: %d is a prime\n", h);
                  }
              }
          }
          return 0;
      }
      

      parallel.c :(使用OpenMP)

      //parallel.c (With OpenMP)
      #include <stdio.h>
      #include <omp.h>
      
      int main(int argc, char *argv[]){
      
          int candidate = atoi(argv[1]);
          int h;
          int prime = 1;
      
          #pragma omp parallel for
          for (h = 1; h < candidate; h++){
      
              if (h > 3){
      
                  if (h % 2 == 0) continue;
      
                  else {
                      prime = 1;
                      int i = 3;
                      for (i; i*i <= h; i+=2){
      
                          if (h % i == 0){
                              prime = 0;
                              break;
                          }
                      }        
                      // if (prime != 0) printf("Number: %d is a prime\n", h);
                  }
              }
          }
      
          return 0;
      }
      

1 个答案:

答案 0 :(得分:2)

首先,我很确定我是你的教授。你的代码,你的问题和时间之间的巧合会令人惊讶。我很高兴您与更大的社区合作,以了解您的课程作业,但请务必在您上班时引用此类来源。

1)测试素数的不同数字在逻辑上是独立的。知道5是否为素数不会告诉你7是否是素数,并且在两个任务之间没有可以重复使用的计算。从并行编程的角度来看,您可以独立计算5和7是否为素数,而无需在线程之间共享任何数据。

2)我认为你可能误解了问题 - 测试个人数字仍然是独立的,无论这些数字是大于还是小于100.测试数字7是否为素数与测试数字105是否相关无关主要。但是,在测试105是否为素数的过程中,您需要确定它是否可以被任何数字{2,3,5,7或9}整除。 这些单独的部门不是独立的。在105的情况下,一旦计算出105 % 5 = 0,就知道这个数字不是素数,因此你不需要测试是否{{ 1}}或105 % 7 = 0。如果你要将你的内部for循环并行化,这就是将要发生的事情 - 你会做一些你不需要做的额外工作。

另外,您不能在OpenMP中的并行for循环中使用105 % 9 = 0语句。如果你仔细想想,你会发现这样的事情没有多大意义。

3)同样,被问到的问题略有不同。问题不在于实现的不同之处,问题在于程序员工作的不同之处。回想一下我们已经完成的一些Pthreads程序 - 手动创建Pthreads和分配工作比简单地将serial-for循环转换为并行for循环要复杂得多。

最后,我会指出一些事情,因为看起来你是StackOverflow的新手。这里的人们通常很乐意帮助完成家庭作业问题,但是当你清楚这一点时会更好地回应。事先做好你正在做作业的事实,并确保包括你的想法和推理,让你达到目前的水平。这里的人不想为你工作,但他们渴望帮助你理解课程背后的有趣概念。

如果您有任何其他问题,请与我们联系, 大卫