2017-10-25 13 views
2

나는 QuantLib의 thread-safety 속성을 명시 적으로 설명하는 문서를 찾을 수 없었습니다. QuantLib configuration documentation에는 스레드 안전과 관련된 많은 컴파일 타임 옵션이 나열되어 있습니다. 기본적으로 QuantLib은 완전히 스레드 안전하지는 않습니다. 특히여러 스레드에서 QuantLib을 사용하는 올바른 방법은 무엇입니까?

,이 있습니다 :

  • QL_ENABLE_SESSIONS는 - "정의 된 경우, 싱글은 다른 세션에 대해 서로 다른 인스턴스들을 반환 할 것이다 당신은 라이브러리와 네임 스페이스 QuantLib에서 sessionId가() 함수를 제공하고 링크해야합니다. 각 세션마다 다른 세션 ID를 반환합니다. 기본적으로 정의되지 않습니다. "

  • QL_ENABLE_THREAD_SAFE_OBSERVER_PATTERN - "정의 된 경우 관찰자 패턴의 스레드 안전성이 있지만 성능이 떨어지는 버전이 사용됩니다 .JVM 또는 .NET 환경에서 SWIG 레이어를 통해 QuantLib을 사용하려면이 패턴을 정의해야합니다 시스템 또는 비동기 가비지 컬렉터가있는 모든 환경. 기본적으로 정의되지 않음. "

  • QL_ENABLE_SINGLETON_THREAD_SAFE_INIT - "싱글 톤 초기화를 스레드로부터 안전하게 만들려면이 값을 정의하십시오. 기본적으로 정의되지 않았으며 여러 세션과 호환되지 않습니다."

어떤 옵션을 사용해야합니까, 나는 QuantLib 사용하려는 경우 다른 어떤 단계를 내가해야 : 여러 스레드에서

  1. 을하지만 결코 같은 시간에 (예를 들어 만 유지하는 경우, 글로벌 잠금)?

  2. 여러 스레드에서 동시에 있지만 개체를 ​​공유하지 않는 경우?

  3. 여러 스레드에서 동시에 개체를 공유합니까?

내 응용을위한 자연 구조는 일단 입력 시장 데이터의 일정한 스트림을 가진 방향성 비순환 그래프는 다양한 개체를 계산하고 갱신하는데 사용하고, 상기 이탈 추정 가격의 흐름을 생성되고 다른 끝. 몇 가지 계산이 오랜 시간이 걸리므로 병렬로 여러 코어를 사용할 수 있어야합니다.

응용 프로그램은 대부분 Java로 작성되며 C++의 일부분만으로 작성되어 QuantLib와 인터페이스합니다. SWIG 래퍼를 사용할 계획이 아닙니다. 자바 가비지 컬렉터의 도움없이 QuantLib 객체의 메모리 관리를 해줘서 기쁩니다.


EDIT! UNIX에서 다음 옵션 중 하나를 설정하기로 결정하면, ./configure 아마에 해당 플래그와 함께 할 :

--enable-sessions 
--enable-thread-safe-observer-pattern 
--enable-thread-safe-singleton-init 

답변

2

SmallChess의 대답은 사실과 거리가 멀지 않습니다. QuantLib에는 잠금 장치 나 안전망이 거의 없으므로 대부분의 사람들은 프로세서를 통해 계산을 배포해야하는 경우 멀티 프로세싱을 사용합니다. 좋은 이유가 있습니다. 좀 더 통찰력을 원하는 사람들을 위해

및 QuantLib에서 사용하는 멀티 스레딩의 보증으로 하지 : 가능하면, 당신을주는 구성 스위치를 사용할 수 있습니까 어떤 다른

  • 싱글 톤의 thread-safe 초기화를위한 안전성 (주의 할 점, 아래 참조)과 같은 몇몇 안전성;

  • 당신 수도있는 여러 스레드가 같은 평가 날짜로 전역을 수정하지 않는 경우, 물건, 를 공유하지 않는 경우 (목록은 싱글에서 상속 클래스를 찾아 한 번에 실행 전역).

  • 다른 스레드에 대해 다른 평가 날짜가 필요한 경우에는 싱글 톤이 실제로 싱글 톤이 아니지만 스레드 당 인스턴스가 있도록 다른 컴파일 스위치를 사용하여 QuantLib을 빌드 할 수 있습니다. 주의 사항 :이 스위치는 싱글 톤의 스레드 안전 초기화와 호환되지 않습니다. 스레드간에 개체를 공유해서는 안됩니다.

  • 개체를 공유하려는 경우 가치가있는 것보다 많은 문제가있을 수 있습니다. 문제는 (1) 커브와 같은 기본 데이터가 변경되면 다시 계산됩니다. (2) 재 계산 (예 : 커브의 부트 스트랩)은 필요한 시점 즉, 일부 커브 메서드가 호출 될 때만 즉시 실행되지 않습니다. 즉, 여러 단계를 별도로 유지해야합니다. 먼저 따옴표의 값을 설정하고 더 이상 변경하지 않아야합니다. 그런 다음 곡선을 돌아서 재 계산을 트리거합니다 (예 : 일부 날짜의 할인 요인을 묻는 경우). 마지막으로, 커브를 계기에 전달하고 가격을 책정하십시오. 계산 중에 값을 변경하면 중간에 부트 스트랩이 수행됩니다. 계산을 시작하기 전에 전체 구성을 트리거하지 않으면 두 개의 인스트루먼트가 동시에 두 개의 부트 스트랩을 트리거 할 수 있습니다. 이는 관련 당사자에게는 적합하지 않습니다.

내가 말한 것처럼, 그것은 아마도 가치가있는 것보다 더 많은 문제 일 것입니다. 이상적으로는 스레드간에 객체를 공유하지 말고 전역을 만지지 마십시오. 그렇지 않으면 다중 처리를 선호합니다.

2

불행하게도, QuantLib이 하지 스레드 안전합니다. 당신이 가지고있는 옵션 중 어느 것도 당신을 도울 수 없습니다. QuantLib은 무료 프로젝트이며, 실제 수학 모델링에 중점을두고 스레드 안전과 같은 계산 최적화는 아닙니다.

에 QuantLib을 포장해야합니다.멀티 스레딩은 이 아니며은 뭘하고 있는지 알지 못하고 관련 소스 코드를 확인하지 않는 한 QuantLib을 권장하지 않습니다.

+0

"당신이 가진 선택이 당신을 도울 것입니다"라고 말할 때, 그들이 생각하는대로하지 않거나, 또는 작동하지 않거나, 또는 어떤 이유로 든 충분하지 않다는 것을 의미합니까? 또는 무엇을? –

+0

@TomAnderson 그들은 당신이하고 싶은 일을하지 않을 것입니다. QuantLib 메일 링리스트를 검색하십시오. thread safe에 관한 게시물이 있습니다. 원하는 코드에 따라 일부 코드 함수는 전역 변수를 사용하지 않기 때문에 스레드로부터 안전합니다. – SmallChess

+0

@TomAnderson 예를 들어 블랙 스콜 (Black Scholes)을 계산하기 만하면됩니다. BlackScholesCalculator에는 전역 종속성이 없으므로 스레드로부터 안전합니다. – SmallChess