Açık mp'yi kullanarak, rasgele kayan nokta sayılarının bir matrisini oluşturduğum ve sonra üzerinde bir dizi hesaplama yaptığım bir paralel program yazıyorum. Şu anda matrisi paralel olarak oluşturduğum adımı yapmak istiyorum, ancak rand() işlevinin eşzamanlı olarak çalışması için bir sorun yaratmadım. Mutex'e randıman sağlamak için kilitleri kullanmak istemiyorum çünkü bu döngüde yapılan tek şey ve muhtemelen sıralı olarak çalıştırmak için daha verimli olacaktır. Bu adımı paralel olarak verimli bir şekilde yapmak için herhangi bir yolu var mı?Eşzamanlı rasgele sayı üretimi
Bu bölümün geçerli kodu (rand sırasında mutex dışında); Yalancı rasgele (Bkz Ben'in yorum) yeterince iyi ise
#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);
}
PRNG'ler sabit bir tohumdan tutarlı bir sayı dizisi oluşturur. Bu düzen (tekrarlanabilirlik) sizin için önemli mi yoksa gerçekten "rastgele" mi istiyorsun? –
Belirli bir sırada olup olmadıkları önemli değil, sorun şu ki, sıralı olarak koştuğum zaman aralığımda oldukça iyi bir yayılımım oldu ama genel olarak paralel olarak değiştirdiğimde sayıları 10'dan azdı ve satırları topladığımda hemen hemen hepsi 0'a kadar eklendi (sırayla hiç negatif olmadım). Bu, işlev çağrısı ile bir çeşit eşzamanlılık sorunu olduğunu düşünmemi sağlıyor. – user381261
Bir saniye bekle - her bin yinelemede ortalamada, rand()% 1000 sıfır olacak, bu yüzden nasıl bölebilirsiniz? – TonyK