Есть ли способ отложить создание каждого потока на openmp? - PullRequest
0 голосов
/ 26 марта 2019

Я пытался распараллелить код, чтобы получить первые "n" простых чисел с помощью openmp, но я понял, что я получаю одинаковые числа повторяться.Я пытался сделать переменную закрытой, но проблема в том, что каждый поток начинается с того же номера, поэтому я не знаю, есть ли способ задержать поток, чтобы каждый поток начинался с другого номера.Вот код, который мне удалось сделать:

    #include <stdio.h>
    #include <omp.h>


    void qs(int lista[],int limite_izq,int limite_der)
    {
        int izq,der,temporal,pivote;

        izq=limite_izq;
        der = limite_der;
        pivote = lista[(izq+der)/2];

        do{
            while(lista[izq]<pivote && izq<limite_der)izq++;
            while(pivote<lista[der] && der > limite_izq)der--;
            if(izq <=der)
            {
                temporal= lista[izq];
                lista[izq]=lista[der];
                lista[der]=temporal;
                izq++;
                der--;
            }
        }while(izq<=der);
        if(limite_izq<der){qs(lista,limite_izq,der);}
        if(limite_der>izq){qs(lista,izq,limite_der);}
    }

    void quicksort(int lista[],int n)
    {
        qs(lista,0,n-1);
    }


    int main() {
        int n_total_primes = 10, n = n_total_primes;
        int i=3;
        int aux = 0;
        int vector[n_total_primes];

        double t1 = omp_get_wtime();


        omp_set_num_threads(4);
        #pragma omp parallel for
        for (n = 1; n < n_total_primes; n++) {
            for (aux = 2; aux < i; aux++) {
                if (i % aux == 0) {
                    aux = i;
                }
            }

            if (i == aux) {
                vector[n] = i;
                n++;
            }
            i++;
            n--;
        }

        vector[0] = 2;
        double t2 = omp_get_wtime();
        printf("Total time: %lf\n", t2-t1);

        quicksort(vector,n_total_primes);

        for ( i = 0 ; i < n_total_primes ; i++ )
            printf("%d\n",vector[i]);

        printf("\nnum_primes=%d, last prime: %d\n", n_total_primes, vector[n_total_primes-1]);
        return 0;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...