2012-06-12 3 views
2

Пожалуйста, простите меня, если мой вопрос не является профессиональным. Я читаю учебники IBM x10. Вот код, который вычисляет PI, но меня смущает:X10 Параллельная обработка общей переменной

public static def countPoints(n: Int, rand:()=>Double) { 
var inCircle: Double = 0.0; 
for (var j:Long = 1; j<=n; j++) { 
    val x = rand(); 
    val y = rand(); 
    if (x*x +y*y <= 1.0) inCircle++; 
} 
    return inCircle; 
} 

val N = args.size() > 0 ? Long.parse(args(0)) : 100000; 
val THREADS = args.size() > 1 ? Int.parse(args(1)) : 4; 
val nPerThread = N/THREADS; 
val inCircle = new Array[Long](1..THREADS); 
finish for(var k: Int =1; k<=THREADS; k++) { 
    val r = new Random(k*k + k + 1); 
    val rand =() => r.nextDouble(); 
    val kk = k; 
    async inCircle(kk) = countPoints(nPerThread,rand); 
} 
var totalInCircle: Long = 0; 
for(var k: Int =1; k<=THREADS; k++) { 
    totalInCircle += inCircle(k); 
} 
val pi = (4.0*totalInCircle)/N; 

Сама программа не трудно, на мой вопрос, так как в каждом countPoints() называют это неоднократно называя аргумент рандов, и перед грибницы мульти-нитей, только один ранд создан, будут ли разные темы разделять одни и те же ранды и нести условия гонки? Если нет, то почему?

ответ

2

Хорошо, что вы беспокоитесь о возможном состоянии гонки здесь. Это часто игнорируется при параллельном вызове генераторов случайных чисел.

К счастью, этот пример свободен от состояния гонки RNG. Каждая итерация цикла for k создает новый экземпляр генератора случайных чисел (и семя его) и порождает один поток. Поскольку countPoints называет свой собственный RNG, здесь нет условия гонки.

Смежные вопросы