openmp distribuire righe ai core/threads

toni1705

Nuovo Utente
98
9
ciao ragazzi mi sto esercitando con open mp
devo svolgere un programma che legga in input 4 vettori( io li ho generati con una rand per comodità) di lunghezza 8
ogni vettore deve fare la somma ed inserire il risultato in un vettore diverso.
insomma ho provato a fare cosi ma mi blocco sulla parte parallela perchè non saprei come distribuire il lavoro trai thread.. :/
ho pensato quindi di fare con un altro modo
creo una matrice di lunghezza 8 di circa 4 righe quindi una matrice bidimensionale [4][8]
bene vado ad alllocare la memoria tutto perfetto.
mi blocco sulla parte parallela di nuovo perchè dovrei sommare le righe e distribuire il lavoro
ho pensato di farlo in un modo
//il processore p0 calcola la prima riga
P1 calcola la 2 riga
e cosi via...
C:
/*
    Scrivere un programma parallelo per l'ambiente QUAD-CORE (p=4) che impieghi il linguaggio C ed utilizzi
    la libreria OpenMP;
    il programma dev'essere organizzato come segue:
    il core master deve leggere 4 differenti vettori
    di reali di lunghezza 8;
    ogni core deve sommare tra loro gli elementi di
    uno dei vettori.
    Infine i risultati devono essere concatenati in un unico vettore di lunghezza 4 e stampati.
*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <omp.h>
#define N 8
#define M 4

int main()                                                   
{
    int i, j, id, sum,nproc,nloc;
    float** v, * vet_sum;

    vet_sum = (float*)malloc(M * sizeof(float)); //vettore delle somme
    //gestisco i 4 vettori come righe di una matrice 
    v = (float**)malloc(M * sizeof(float*));
    for (i = 0; i < 4; i++)
        v[i] = (float*)malloc(N * sizeof(float));
    sum = 0;
    srand(time(NULL));
    //lettura vettori in maniera automatica (generazione di numeri casuali)
    for (i = 0; i < M; i++)
        for (j = 0; j < N; j++)
            v[i][j] = rand() % 30 + 1;   // oppure scanf("%d", &v[i][j]);
    for (i = 0; i < M; i++) {
        printf("\n");
        for (j = 0; j < N; j++)
            printf(" %lf ", v[i][j]);
    }
    omp_set_num_threads(4);
#pragma omp parallel  private (id,i,sum) shared (vet_sum)
    {
    id = omp_get_thread_num();
    sum = 0;
    nproc = omp_get_num_threads();
        for (i = 0; i <4; i++)
        {for (j=0;j<8;j++)
        {
                sum += v[i][j] ;
        }
                vet_sum[i] = sum;
            
        }// fine for

        
    }// fine regione parallela
    


    }
ho provato così ma mi sono bloccato mentalmente :(
 

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Se ho capito bene devi prendere in input 4 vettori, fare la somma e inserire il risultato di ciascun vettore in un altro vettore?
Esempio:
A = [1,2,3,4,5] Lo farà il thread 1
B=[6,7,8,9,10] thread 2
C=[11,12,13,14,15] thread 3
D=[16,17,18,19,20] thread 4

Vettore somma = [15, 40, 65, 90]

Corretto?
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili