Sto provando a mettere in parallelo un programma che sto usando e ho ottenuto la seguente domanda. Avrò una perdita di prestazioni se più thread devono leggere/scrivere sullo stesso vettore ma diversi elementi del vettore? Ho la sensazione che questo sia il motivo per cui il mio programma difficilmente diventa più veloce nel parallelizzarlo. Prendere il seguente codice:Vettori condivisi in OpenMP
#include <vector>
int main(){
vector<double> numbers;
vector<double> results(10);
double x;
//write 10 values in vector numbers
for (int i =0; i<10; i++){
numbers.push_back(cos(i));
}
#pragma omp parallel for \
private(x) \
shared(numbers, results)
for(int j = 0; j < 10; j++){
x = 2 * numbers[j] + 5;
#pragma omp critical // do I need this ?
{
results[j] = x;
}
}
return 0;
}
Ovviamente il vero programma fa operazioni molto più costosi, ma questo esempio deve solo spiegare la mia domanda. Quindi, il ciclo for può essere eseguito in modo rapido e completamente parallelo oppure i vari thread devono attendere reciprocamente perché solo un thread alla volta può accedere al numero di vettore, ad esempio sebbene stiano tutti leggendo elementi diversi del vettore?
Stessa domanda con l'operazione di scrittura: ho bisogno del pragma critico o non è un problema poiché ogni thread scrive in un diverso elemento dei risultati del vettore? Sono contento di ogni aiuto che posso ottenere ed inoltre sarebbe bello sapere se esiste un modo migliore per farlo (forse non utilizzare i vettori, ma semplici array e puntatori, ecc.) Ho anche letto i vettori aren in alcuni casi è sicuro usare thread: OpenMP and STL vector
Grazie mille per il vostro aiuto!
Lui non ridimensiona il vettore a tutti. – eudoxos
@eudoxos Mi rendo conto che dal frammento di codice, volevo solo assicurarmi che fosse menzionato, specialmente da quando ha rilevato il fatto che i vettori STL non sono thread-safe in determinate condizioni – SirGuy
+1: non arriva davvero qui, ma devi tenere a mente che le operazioni specifiche del vettore come accodamento, ridimensionamento, ecc. non sono thread-safe e probabilmente si rompono.Ma funzionare solo sugli elementi di un vettore va bene fintanto che ogni elemento viene scritto da un solo thread. –