Sito Eratostenesa w C. OpenMP

0

Witam,
moim zadaniem jest wykonanie takiego tematu:

Równoległe wyznaczanie liczb pierwszych. Korzystając z interfejsu
OpenMP napisać wersje równoległe programu wyznaczania liczb
pierwszych metodą sita Eratostenesa. Rozważyć dwa sposoby
zrównoleglenia problemu:

    a) jako dekompozycje funkcjonalną

    b) jako dekompozycję danych

    Porównać przyspieszenia obu wersji równoległych.

Kodzik napisałem taki:

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

int main ()
{
        int n;
        int j;
        int i;
        int Od;
        int odczyt;
        printf("Wyszukaj liczby pierwsze od 2 do: \n");
        scanf("%d", &n);
        
        int tab[n+1];
          
          for(i = 1; i<=n; i++) tab[i]=1;
      
      #pragma omp parallel num_threads(5) 
{   

        for (i = 2; i*i<=n; i++)
        {
          if (tab[i]==0)
          continue;
          for(j = i + i; j<=n; j += i) 
          tab[j]=0;
          }
        }
        for (odczyt = 2; odczyt <= n; odczyt++)
        {
        if (tab[odczyt] == 1)
        printf("%d\n", odczyt);
        }
return 0;
}

Jednak nie wiem jak poradzić sobie z podpunktami:
a) jako dekompozycje funkcjonalną

    b) jako dekompozycję danych

W necie doszukałem się czegoś takiego:
· Równoległość danych – #pragma for
· Równoległość funkcjonalna – #pragma sections
· Aplikacja sekwencyjna – #pragma single

jednak po dodaniu #pragma for wysykakuje mi błąd:
invalid controlling predicate

Ktoś wie jak to poskładać w całość :) ?

0

Natknąłem się na kolejny problem tzn ustawiam na 2 wątki a mimo to oblicza całość 1 wątek ustawie na 5 wątków to oblicza to 3 wątki.

 
#include <stdio.h>
#include <omp.h>
#include <math.h>
 
int main ()
{
        int n;
        
        int i;
        int j;
        
        int odczyt;
        printf("Wyszukaj liczby pierwsze od 2 do: \n");
        scanf("%d", &n);
 
       int tab[1001];
		for(i = 1; i<=1000; i++) tab[i]=1;

 
          
 
      #pragma omp parallel num_threads(2)
{  
int x;

#pragma omp for private (x,j)
        for (x = 2; x<=n; x++)
        {
          if (tab[x]==0) continue;	  		
          	for(j = x + x; j<=n; j += x)
          	{	
		  		if(tab[j]==0) continue;	
          		printf("%d ", x);
          		printf("wielokrotnosc %d ", j);
          		printf(" dodawal watek nr %d \n",w);
          		tab[j]=0;
      	  	}
        }
}
        
        for (odczyt = 2; odczyt <=n; odczyt++)
        {
        	if (tab[odczyt]==1)
        	{
        	
        printf(" %d ", odczyt);
			}
        }
return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1