Sto scrivendo un programma parallelo usando open mp in cui io generi una matrice di numeri in virgola mobile casuali e poi eseguo un numero di calcoli su di esso. Attualmente voglio fare il passo in cui creo la matrice in parallelo, ma ho il problema che la funzione rand() non è stata pensata per funzionare contemporaneamente. Non voglio usare i lock per fornire mutex su rand perché questa è l'unica cosa che viene fatta nel ciclo e probabilmente sarebbe più efficiente eseguirla in sequenza. C'è un modo per fare questo passo in modo efficiente in parallelo?Generazione contemporanea di numeri casuali
Qui se il codice corrente per questa parte (senza mutex su rand);
#pragma omp parallel default(private)
{
int i= omp_get_thread_num();
for(int j=0; j<cols; j++)
matrix[i][j]= rand()%1000 + (float)(rand()%100)/(float)(rand()%1000);
}
I PRNG generano una sequenza coerente di numeri da un seme fisso. Questo ordine (ripetibilità) è importante per te o vuoi veramente "casuale"? –
Non importa se sono in un ordine particolare, il problema che stavo avendo è stato quando l'ho eseguito in sequenza ho ottenuto una buona diffusione sul mio intervallo ma quando l'ho cambiato in parallelo in generale i numeri erano meno di 10 e quando riassumo le righe quasi tutte sono aggiunte a 0 (non ho mai avuto negativi con il sequenziale). Questo mi fa pensare che ci sia una sorta di problema di concorrenza con la chiamata di funzione. – user381261
Aspetta un secondo - una volta ogni mille iterazioni in media, rand()% 1000 sarà zero, quindi come puoi dividerlo? – TonyK