문제

나는 몇 가지의 병렬 Fortran90 코드에서는 각 스레드가 필요를 생성할 동일한 시퀀스의 임의의 숫자입니다.

I 임의의 번호 생성기는 것 같 스레드에 안전하지 않은,그러기 위해 주어진씨,나는 완전히 없을 반복과 같은 결과가 프로그램을 실행할 수 있습니다.

나는 실패를 했었(almost)전체 웹한 코드를 스레드에 안전 RNG.할 수 있었 사람을 나에게 제공(링크)코드의 하나?

사전에 감사합니다!

도움이 되었습니까?

해결책

좋은 의사 란덤 번호 생성기 fortran90을 찾을 수 있습니다 인텔 수학 커널 벡터 통계 라이브러리. 그들은 안전합니다. 또한, 왜 스레드 사프가되어야합니까? 각 스레드가 동일한 목록을 얻으려면 동일한 시드로 각 스레드에 대한 새 PRNG를 인스턴스화하십시오.

다른 팁

가장 반복 가능한 임의의 숫자 생성기는 어떤 형태로 상태가 필요합니다. 상태가 없으면 다음에 오는 일을 할 수 없습니다. 스레드 안전을 위해서는 주를 직접 붙잡을 수있는 방법이 필요합니다 (즉, 전역이 될 수 없습니다).

할 때"말할 필요를 생성할 동일한 시퀀스의 임의의 숫자를"너는 것을 의미

  • 각 스레드가 필요가 생성 스트림의 번호를 동일하고 다른 스레드가? 이 의미를 선택하는 씨앗을 벗기기 전에는 스레드,다음을 인스턴스화하는 스레드-로컬 PRNG 에서 각 스레드와 같은 씨앗이다.

  • 할 수 있을 반복 같은 일련의 숫자 사이에 다른 실행되는 프로그램이지만,각 스레드를 생성하는 그것의 자신의 독립된 시퀀스에 있습니까? 이 경우에,당신은 여전히을 공유할 수 없습 단일 PRNG 기 때문에 쓰레드 동작 순서를 결정되어 있지 않습니다.그래서 종자 단 PRNG 으로 알려진 씨를 시작하기 전에 스레드를 생성하는 데 사용합니다 초기 씨앗을 위한 스레드. 다음 당신이 스레드 인스턴스화-지역 발전기 각 스레드에서...

에서 이러한 각각의 경우에 당신은 무엇을 참고해야 닐 버 말에 대한 통계:대부분의 일반적인을 보장하는 PRNG 을 주장은 신뢰할 수 없 때 믹스 스트림에서 생성된 이 방법입니다.


두 경우 모두에서 필요하신 스레드 로컬 PRNG.I don't know what 에서 사용할 수 있 f90...하지만 작성할 수도 있습니다 당신은 자신의(조회 메르센 트위스터, 고,쓰 routne 는 저장된 상태로 매개 변수...).

Fortran77,이 같은 것을 볼 것입니다

      function PRNGthread (state)

      double state(statesize)

c stuff happens here which uses and manipulates the state vector...

      PRNGthread = result
      return 

고 각 스레드가 유지해야 합 별도의 상태 벡터,하지만 모두 사용하는 것과 동일한 초기 값입니다.

나는 당신이 동일한 랜덤 숫자 스트림을 생성하기 위해 모든 스레드가 필요하다는 것을 알고 있습니다.

재현 가능한 숫자 스트림을 생성하고 상당히 빠른 매우 좋은 의사 랜덤 생성기는 MT19937. 스레드를 생성하기 전에 씨앗을 생성하는지 확인하지만 모든 스레드에서 MT의 별도 인스턴스를 생성하십시오 (MT 스레드의 인스턴스를 로컬로 만드십시오). 이렇게하면 모든 MT가 동일한 숫자 스트림을 생산할 것입니다.

어때 sprng? 나는 그것을 직접 시도하지 않았다.

Mersenne Twister/MT19973의 스레드-안전 Fortran 90 버전을 코딩했습니다. PRNG 상태는 파생 유형 (randomNumbersequence)으로 저장되며 절차를 사용하여 발전기를 시드하거나 다음 요소를 순서대로 얻습니다.

보다 http://code.google.com/p/i3rc-monte-carlo-model/source/browse/trunk/code/randomnumbersformc.f95

대안은 다음과 같습니다.

  • 발전기의 시드 값에 동기화 객체 (예 : 뮤텍스)를 사용하십시오. 불행히도 생성기에 대한 액세스에 대한 코드를 시리얼링합니다.
  • 발전기에 스레드 - 로컬 스토리지를 사용하여 각 스레드가 자체 씨앗을 얻습니다. 이렇게하면 앱에 통계적 문제가 발생할 수 있습니다.
  • 플랫폼이 적절한 원자 연산을 지원하는 경우 씨앗에서 사용하십시오 (그러나 아마도 그렇지 않을 것입니다).

매우 고무적인 목록이 아닙니다. 그리고 그것을 더하기 위해, 나는 Fortran에서 그들 중 하나를 구현하는 방법을 모른다!

이 기사 https://www.cmiss.org/opencmiss/wiki/randomnumbergenerationwithopenmp Fortran 구현에 링크 할뿐만 아니라 스레드와 함께 PRNG를 사용할 수 있도록하는 데 필요한 핵심 사항을 언급합니다. 가장 중요한 점은 다음과 같습니다.

Ziggurat의 Fortran90 버전에는 '저장'속성이있는 여러 변수와 배열이 있습니다. 그런 다음 균일 한 RNG를 병렬화하기 위해 필요한 변경 사항은 이러한 변수 배열을 각 스레드에 대해 별도의 값으로 만드는 것으로 보입니다 (False 공유를 조심하십시오). 그런 다음 PRNG 함수가 호출되면 스레드 번호를 전달하고 해당 상태 값을 사용해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top