2014년 4월 22일 화요일

Multi-Threading 과 Quantlib

원문출처

http://hpcquantlib.wordpress.com/2013/07/26/multi-threading-and-quantlib/

QuantLib 자체로는 Thread-Safe 하지 않다. 하나이상의 코어에서 몇개의 독립적인 프로세스를 만드는 것이 표준이다. Ricacardo의 thread-safe 한 singleton 패치는 서로다른 스레드가 명시적으로 객체를 공유하지 않으면 Quantlib을 Multi-threading 응용프로그램에서 사용할수 있습니다. 사실 이 패치는 싱글턴 패턴을 각 스레드 로컬한 싱글턴 패턴으로 바꿔줍니다.

이패치의 사용사례중 하나는 test-suite를 Muliti-threading 환경에서 테스트해보는 것입니다. 예를들어 i7 3.2Ghz 쿼드코어에 하이퍼스레딩 코어 4개를 합한 환경에서 약 8분이 걸리던 작업이 2분정도 걸리게 됩니다.

QuantLib을 Java/Scala/C# or F# 응용프로그램에서 SWIG Layer를 통하여 사용하는 것은 multi-threading 요구사항을 위반하는 것입니다. 왜냐하면 가비지 컬랙터가 다른 스레드에서 실행되고 QuantLib 객체가 서로 다른 쓰레드간에 공유되기 때문이다. 이것은 QuantLib 의 Observer pattern 구현에서 문제를 야기한다 이에 관한 자세한 얘기는 다음에서 다룬다.

boost::signals2 와 Riccardo의 Thread-safe singleton 패치에 기반한 observer pattern의 향상된 구현과 multi-threading test runner는 Github에서 다운 받을수 있다.

Linux/MacOS 환경에서의 사용시

./configure --enable-tss --enable-thread-safe-observer-pattern
thread-safe singleton 과 thread-safe observer pattern을 사용할수 있게 한다.

윈도우 환경에서는 다음에 상응하는 전처리기를 userconfig.hpp 에 명시되어 있습니다.

#define QL_ENABLE_TSS
#define QL_ENABLE_THREAD_SAFE_OBSERVER_PATTERN
boost::shared_ptr의 후크를 변화시키기 위해 다음 파일에서 전처리지시자 BOOST_SP_ENABLE_DEBUG_HOOKS 를 BOOST_SP_ENABLE_DEBUG_HOOKS_2 로 변경합니다.

boost/smart_ptr/detail/sp_counted_impl.hpp
배경 : 원래의 전처리지시자인 BOOST_SP_ENABLE_DEBUG_HOOKS 은 shared_ptr의 메모리 레이아웃을 변경하는 것이 다른 미리 컴파일된 shared_ptr을 사용하는 라이브러리와 문제를 일으킬수 있습니다.

이러한 작업의 이점은 Multi-threading 응용프로그램에서 서로다른 스레드 간에 SWIG/QuantLib 의 객체를 명시적으로 공유하지 않기때문에 Java/Scala/C#/F# and a thread local singleton implementation 을 위한 안정적인 SWIG Interface 입니다.

댓글 없음:

댓글 쓰기