Параллельное программирование c++, OpenMP
Всем привет Дело такое, написал код для следующего задания:
Найти наименьшие три последовательно возрастающие простые числа, большие заданного N, сумма которых является простым числом (например, при N=4 такими числами являются 5, 7 и 11).
Теперь нужно его распараллелить на OpenMP Сижу второй день, не могу ничего придумать, прошу помочь.
Собственно, сама программа
#include <iostream>
using namespace std;
bool checkPrimeNumber(unsigned long long);
unsigned long long mass[3];
int k;
bool checkPrimeNumber(unsigned long long n) {
bool isPrimeNumber = true;
if (n == 0 || n == 1) {
isPrimeNumber = false;
} else {
for (int i = 2; i <= n / 2; i++) {
if (n % i == 0) {
isPrimeNumber = false;
break;
}
}
}
return isPrimeNumber;
}
void gen(unsigned long long n) {
if (checkPrimeNumber(n)){
n=n+1;
}
for (unsigned long long & j : mass){
for (unsigned long long i = n; i<= n*100; i++) {
if (checkPrimeNumber(i)) {
j=i;
n = i + 1;
break;
}
}
}
if (checkPrimeNumber(mass[0]+mass[1]+mass[2])) {
cout << "Parallel: " << mass[0] << ", " << mass[1] << ", " << mass[2] << ", " << mass[0]+mass[1]+mass[2]<<endl;
return;
}
else{
n=mass[0]+1;
gen(n); // иначе рекурсия
}
}
int main() {
cout << "Enter N:";
cin >> k;
gen(k);
Заранее спасибо.
Ответы (1 шт):
Автор решения: D1x1
→ Ссылка
Получилось что-то вроде этого
#include <iostream>
#include "omp.h"
using namespace std;
bool checkPrimeNumber(unsigned long long);
unsigned long long mass[3];
unsigned long long k;
bool checkPrimeNumber(unsigned long long n) {
bool isPrimeNumber = true;
if (n == 0 || n == 1) {
isPrimeNumber = false;
} else {
for (unsigned long long i = 2; i <= n / 2; i++) {
if (n % i == 0) {
isPrimeNumber = false;
break;
}
}
}
return isPrimeNumber;
}
void gen(unsigned long long n) {
if (checkPrimeNumber(n)){
n=n+1;
}
for (unsigned long long & j : mass){
for (unsigned long long i = n; i<= n*100; i++) {
if (checkPrimeNumber(i)) {
j=i;
n = i + 1;
break;
}
}
}
if (checkPrimeNumber(mass[0]+mass[1]+mass[2])) {
cout << "Non Parallel: " << mass[0] << ", " << mass[1] << ", " << mass[2] << ", " << mass[0]+mass[1]+mass[2]<<endl;
return;
}
else{
n=mass[0]+1;
gen(n);
}
}
void parallel_gen(unsigned long long n) {
int j;
if (checkPrimeNumber(n)){
n=n+1;
}
#pragma parallel for
for (unsigned long long i = n; i <= i*100;i++){
if (checkPrimeNumber(i)){
mass[0]=i;
n=i+1;
}
if (checkPrimeNumber(i)){
mass[1]=i;
n=i+1;
}
if (checkPrimeNumber(i)){
mass[2]=i;
n=i+1;
}
break;
}
if (checkPrimeNumber(mass[0]+mass[1]+mass[2])) {
cout << "Parallel: " << mass[0] << ", " << mass[1] << ", " << mass[2] << ", " << mass[0]+mass[1]+mass[2]<<endl;
return;
}
else{
n=mass[0]+1;
parallel_gen(n);
}
}
int main() {
cout << "Enter N:";
cin >> k;
double start = omp_get_wtime();
gen(k);
double end = omp_get_wtime();
cout << "Time: " << end-start << endl;
start = omp_get_wtime();
parallel_gen(k);
end = omp_get_wtime();
cout << "Time: " << end-start << endl;
system("pause");
Результаты:



