Параллельное программирование 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");

Результаты:

Тест 1

Тест 2

Тест 3

Тест 4

→ Ссылка