pi를 계산하기 위해 몬테카를로 방법을 병렬 처리하는 데 문제가 있습니다.pi 계산의 OpenMP 병렬화가 느리거나 잘못되었습니다.
#pragma omp parallel for private(i,x,y) schedule(static) reduction(+:count)
for (i = 0; i < points; i++) {
x = rand()/(RAND_MAX+1.0)*2 - 1.0;
y = rand()/(RAND_MAX+1.0)*2 - 1.0;
// Check if point lies in circle
if(x*x + y*y < 1.0) { count++; }
}
문제는 그것이 I가 schedule(static)
PI를 사용하는 경우를 과소 평가하고, I는 schedule(dynamic)
를 사용하는 경우 일련의 구현보다 느리다 : 여기를위한 루프 parallelised이다. 내가 도대체 뭘 잘못하고있는 겁니까? 다른 문제를 해결하기 위해 (예 : Using OpenMP to calculate the value of PI) 시도했지만 직렬 구현보다 훨씬 느립니다. 사전
'rand()'는 스레드로부터 안전한가요? – Mysticial
@Mystical : 그렇지 않은 것 같습니다 : http://stackoverflow.com/questions/6161322/using-rand-with-multiple-threads-in-c –
나는 @Mysticial이 올바른 생각을 가지고 있다고 생각합니다. 'rand'는 일반적으로 내부 자원을 공유 자원으로 사용하여 모든 호출에서 직렬화를 강제하는 내부 "시드"를 갖습니다. 그렇지 않으면 잘못된 결과가 발생할 위험이 있습니다. 사용 가능한 경우'rand_r' 또는 (선호)'drand48_r'을 대신 사용해보십시오. 또는 C++ 11에 도입 된 난수 생성 클래스를 고려하십시오. 각 인스턴스는 자체 상태를 가지므로 직렬화를 피해야합니다 (그러나 초기화 절차가 까다로울 수 있습니다. 동일한 시퀀스를 만드는 여러 스레드가 거의 효과가 없을 수 있습니다). –