我刚刚进入学习OpenMP的阶段,所以请耐心等待。
我有工作代码,用于在argv [1]中获取指定数字下的素数,一个使用常规for循环和OpenMP。以下是我需要理解的以下问题:
(常规循环)
(对于OpenMP循环)
以下是代码。他们工作正常。 :
//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;
}
答案 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的新手。这里的人们通常很乐意帮助完成家庭作业问题,但是当你清楚这一点时会更好地回应。事先做好你正在做作业的事实,并确保包括你的想法和推理,让你达到目前的水平。这里的人不想为你工作,但他们渴望帮助你理解课程背后的有趣概念。
如果您有任何其他问题,请与我们联系, 大卫