ciao ragazzi sto svolgendo un piccolo esercizio( senza avere soluzioni)
la traccia richiede che un processore legga un vettore di lunghezza 8 e che moltiplichi il vettore per il proprio identificativo
specificamente il primo processore deve moltiplicare N numeri e il secondo la restante N parte per il proprio identificativo avendo a disposizione 2 core/threads;
(i primi 4 numeri devono essere moltiplicati per il primo processore che ha identificativo 0)
( gli ultimi 4 n moltiplicati per il processore con identificativo 1);
il problema sta con l'esecuzione del programma col primo thread perchè in quel caso moltiplicando per 0 il risultato dovrebbe essere 0 per 4 numeri invece vengono salvati due volte i numeri dato dal prodotto con il 2 thread
la traccia richiede che un processore legga un vettore di lunghezza 8 e che moltiplichi il vettore per il proprio identificativo
specificamente il primo processore deve moltiplicare N numeri e il secondo la restante N parte per il proprio identificativo avendo a disposizione 2 core/threads;
(i primi 4 numeri devono essere moltiplicati per il primo processore che ha identificativo 0)
( gli ultimi 4 n moltiplicati per il processore con identificativo 1);
il problema sta con l'esecuzione del programma col primo thread perchè in quel caso moltiplicando per 0 il risultato dovrebbe essere 0 per 4 numeri invece vengono salvati due volte i numeri dato dal prodotto con il 2 thread
C:
#include <stdio.h>
#include <omp.h>
#include <stdlib.h>
#define DUAL_CORE 2
#define N 8
int main()
{
int i, v[N], id, nloc,nproc,v2[N];
srand(time(NULL));
for (i = 0; i < N; i++)
v[i] = rand() % 10 + 1;
for (i = 0; i < N; i++)
printf("%d ", v[i]);
printf("\n");
omp_set_num_threads(DUAL_CORE); //che è lo stesso di impostare la clausola num_threads(2)
#pragma omp parallel private(i, id, nloc) shared(v)
{
id = omp_get_thread_num();
nproc=omp_get_num_threads();
nloc = N / omp_get_num_threads();
//printf("nproc:%d id:%d nloc:%d \n", nproc,id,nloc);
for (i = 0; i < nloc; i++) {
v[i] = v[i + nloc * id] * id;
}/*
i=0, 0+4*0=0,
i=1, 1+4*0=1,
i + (nloc*id) se id=0 => ...
i=3, 3+4*0=0
*/
}
//se eventualmente vogliamo stampare il nuovo vettore...
for (i = 0; i < N; i++)
{
printf("%d ", v[i]);
}
}