존경해 마지 않는 Mark S. joshi 아저씨의 최근 역작인 kooderive 분석에 관한 얘기를 쓰겠다.
현재는 kooderive 0.3 버전까지 Release 되어있는 상태이고 이것은
https://www.google.co.kr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CBsQFjAA&url=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fkooderive%2F&ei=ZgufU7DtNcqF8gXY6ILYAw&usg=AFQjCNFw_G47cWqOgRGjPGEtaCxcYqYNkg&sig2=j1TzzBDwqdBjYlayn6Sgdg&bvm=bv.68911936,d.dGc
에서 확인, 다운로드가 가능하다.
현재 노트북에 있는 그래픽 카드는 GT 540M 이다. 쿠다의 버전은 6.0 toolkit을 쓸것이고 Visual Studio 2012 express for deskTop을 사용할것이다. 무슨 이유인지 Visual Studio 2012는 MS에서 버린 느낌이 들지만 .. joshi 아저씨가 택한 버전이라 .. 따르려고 한다.. 사실 컴터에 2010 버전과 2013 버전이 있지만 ... 둘다 작업을 하다가 실패 했다능...
이전엔 cuda를 깔기가 복잡했던것 같은데 이제는 여기에서 컴터에 맞는 버전을 가져다가 설치를 하면 알아서 visual studio 버전마다 필요한 요소들을 설치해준다. 5.5 버전이 나오기 전에는 좀 복잡하고 설정도 많이 해야 했던거 같은데 ... toolkit이 알아서 해준다. 사실 joshi 아저씨는 toolkit의 버전을 5.5라고 했지만 ... 내가 못찻았다... 그부분은 알아서 누군가가 찾는다면 링크좀 남겨주세요~~
그럼 적당히 준비가 다 된듯 하다.
1. GPU programming이 가능한 그래픽 카드
2. Cuda Toolkit 6.0
3. Visual Studio 2012
그리고
4. kooderive 0.3 release
2014년 6월 16일 월요일
2014년 6월 1일 일요일
Ten IPython essentials
1. 콘솔에서 IPython 구동하기
IPython이 제대로 설치 되었다면 shell 상에서 IPython 이라는 명령어를 통하여 sheel을 IPython interpreter 처럼 사용할수 있다.
2. IPython을 system shell처럼 사용한다.
IPython shell은 extended shell 로서 pwd, cd, ls 등의 명령어를 이용할 수 있다.
%lsmagic 명령어를 통하여 사용할 수 있는 모든 magic 명령어를 검색할 수 있다.
3. history를 이용하기
IPython은 command history 기능을 제공한다.
4. tap 자동완성
IPython에서는 Tap 키를 이용한 자동완성 기능을 제공한다. Tap키를 이용하여 제공할수 있는 것이 하나라면 자동으로 채워지지만 두개 이상이라면 Tap 키를 이용하여 자동완성을 할수 있는 리스트를 제공한다.
5. %run 명령어
%run 명령어를 통하여 ***.py 형식의 파이썬 스크립트 파일을 실행할수 있다.
6. %timeit
간단한 benchmark 를 위한 magic 명령어이다. 하나의 수행을 하는 경우 경과시간을 표시할수 있다. 하나의 수행을 여러번 반복적으로 수행하는 경우, 각시행의 경과시간과 평균시간을 구할수 있다.
7. %debug
IPython 에는 강력한 디버거가 존재한다. 콘솔상에서 예외처리가 일어나는 경우 어디든지 %debug 명령어를 통하면 모든 지역변수, stack trace back에 접근할수 있고 위아래를 u, d키를 이용하여 이용이 가능하며 q키를 이용하여 종료할수 있다.
8.Pylab
%Pylab magic을 이용하여 공학계산을 포용하고 있는 NumPy 와 matplotlib을 이용할 수 있다.
9. IPython notebook을 이용하기
Notebook은 IPython의 기능을 다행문자편집을 위한 브라우져에서 사용가능하게 한다. 이것은 세련되고 강력한 상호작용과 재생산을 위한 Python을 사용하기 위한 방법이다.
10. Customizing IPython
Python 파일에서 사용자가 선호하는 것을 당신은 저장할수 있다. 이 파일은 IPython profile 이라고 불리운다. 해당파일을 생성하기위해서는 ipython profile create 라고 쓴다. 만약 다른이름의 프로필 파일을 만들고 싶다면 ipython profile create profilename 이라고 쓴다. 그 프로필 파일을 이용하여 ipython을 launch 하고 싶다면 ipython --profile= profilename 이라고 쓴다.
IPython이 제대로 설치 되었다면 shell 상에서 IPython 이라는 명령어를 통하여 sheel을 IPython interpreter 처럼 사용할수 있다.
2. IPython을 system shell처럼 사용한다.
IPython shell은 extended shell 로서 pwd, cd, ls 등의 명령어를 이용할 수 있다.
%lsmagic 명령어를 통하여 사용할 수 있는 모든 magic 명령어를 검색할 수 있다.
3. history를 이용하기
IPython은 command history 기능을 제공한다.
4. tap 자동완성
IPython에서는 Tap 키를 이용한 자동완성 기능을 제공한다. Tap키를 이용하여 제공할수 있는 것이 하나라면 자동으로 채워지지만 두개 이상이라면 Tap 키를 이용하여 자동완성을 할수 있는 리스트를 제공한다.
5. %run 명령어
%run 명령어를 통하여 ***.py 형식의 파이썬 스크립트 파일을 실행할수 있다.
6. %timeit
간단한 benchmark 를 위한 magic 명령어이다. 하나의 수행을 하는 경우 경과시간을 표시할수 있다. 하나의 수행을 여러번 반복적으로 수행하는 경우, 각시행의 경과시간과 평균시간을 구할수 있다.
7. %debug
IPython 에는 강력한 디버거가 존재한다. 콘솔상에서 예외처리가 일어나는 경우 어디든지 %debug 명령어를 통하면 모든 지역변수, stack trace back에 접근할수 있고 위아래를 u, d키를 이용하여 이용이 가능하며 q키를 이용하여 종료할수 있다.
8.Pylab
%Pylab magic을 이용하여 공학계산을 포용하고 있는 NumPy 와 matplotlib을 이용할 수 있다.
9. IPython notebook을 이용하기
Notebook은 IPython의 기능을 다행문자편집을 위한 브라우져에서 사용가능하게 한다. 이것은 세련되고 강력한 상호작용과 재생산을 위한 Python을 사용하기 위한 방법이다.
10. Customizing IPython
Python 파일에서 사용자가 선호하는 것을 당신은 저장할수 있다. 이 파일은 IPython profile 이라고 불리운다. 해당파일을 생성하기위해서는 ipython profile create 라고 쓴다. 만약 다른이름의 프로필 파일을 만들고 싶다면 ipython profile create profilename 이라고 쓴다. 그 프로필 파일을 이용하여 ipython을 launch 하고 싶다면 ipython --profile= profilename 이라고 쓴다.
2014년 5월 19일 월요일
python pakage website
1. IPython
http://ipython.org/
2. Numpy 다차원 배열에서의 고성능의 벡터연산을 위한 페키지
http://www.numpy.org/
3. Scipy 진보된 수치적 알고리즘
http://www.scipy.org/
3. Matplotlib
http://matplotlib.org/
4. Matplotlib-basemap mapping tool box for Matplotlib
http://matplotlib.org/basemap/
5. NetworkX
http://networkx.lanl.gov
6. Pandas
http://pandas.pydata.org
7. Python Imaging Library(PIL)
http://pythonware.com/products/pil
8. Cython
http://cython.org
http://ipython.org/
2. Numpy 다차원 배열에서의 고성능의 벡터연산을 위한 페키지
http://www.numpy.org/
3. Scipy 진보된 수치적 알고리즘
http://www.scipy.org/
3. Matplotlib
http://matplotlib.org/
4. Matplotlib-basemap mapping tool box for Matplotlib
http://matplotlib.org/basemap/
5. NetworkX
http://networkx.lanl.gov
6. Pandas
http://pandas.pydata.org
7. Python Imaging Library(PIL)
http://pythonware.com/products/pil
8. Cython
http://cython.org
2014년 5월 5일 월요일
IPython 설치하기
IPython 설치하기
IPython을 설치하는 방법은 다양합니다. 그리고 공식문서에서 고급사용자와 개발자를 대상으로 소스에서 수동설치하는 방법을 자세히 다루고 있습니다.
간단히 설치를 원하는 사용자를 위한 설명은 여기에서 하겟습니다. 이것들은 python 2.7을 기반으로 설정이 되어 있습니다. 이것은 notebook 과 과학적인 계산과 데이터 분석에 쓰이는 추가적인 기본 라이브러리모든 종속성을 모두 포함하고 있습니다.
Mac or Windows
1. Anaconda 혹은 무료 버젼인 Enthought Canopy
2. IPython Update
Anaconda:conda update conda conda update ipythonEnthought Canopy:enpkg ipython
Linux
리눅스에서는 우리가 원하는 모든것은 pakage managers 에 이미 있다.
- IPython과 그의 종속적인 것들의 설치:
- 우분투 혹은 Debian기반의 리눅스 shell:
sudo apt-get install ipython-notebook
- Fedora 18 :
sudo yum install python-ipython-notebook
- 과학적인 계산을 위한 추가 설치:
- 우분투 혹은 Debian기반의 리눅스 shell:
sudo apt-get install python-matplotlib python-scipy \ python-pandas python-sympy python-nose - Fedora 18:
sudo yum install python-matplotlib scipy python-pandas sympy python-nose
2014년 4월 24일 목요일
C++ 에서 QuantLib-SWIG 와 Thread-Safe 한 Observer Pattern
원문출처
http://hpcquantlib.wordpress.com/2012/02/27/quantlib-swig-and-a-thread-safe-observer-pattern-in-c/
QuantLib은 사실 Thread-Safe 하지 않습니다. 멀티코어나 병렬환경에서의 성공적인 사용은 여러 프로세스간의 message passing에 의해서 보다는 shared memory 와 multi threading 에 의해서 이루어 집니다. 만약 서로다른 thread 가 서로 다른 object에서 작동을 한다면 QuantLib 또한 Multi threading 환경에서 사용될수 있습니다.(QL_ENABLE_SESSIONS 를 정의 하는 것은 singleton을 thread에 종속적이게 만듭니다.)
만약 당신이 QuantLib을 SWIG를 통하여 Java나 Scala에서 사용한다면 설령 메인 루틴이 싱글스레드 일지라도 QuantLib 루틴은 자동적으로 multi threading 환경에서 실행되어집니다.
JVM의 가비지 컬렉터는 보통 다른 thread에서 돌고 있습니다. 이것은 QuantLib에 구현되어 있는 Observer Pattern 과 결합하여 심각한 문제를 초래 할수 있습니다. 즉, 아래의 간단한 single thread Scala 코드는 멀티코어 컴퓨터에서 짧은 시간에 충돌이 일어날수 있습니다.
가장 중요한 문제는 Observer 가 Destructor가 작용하기 전에 사용불능 상태가 되는것입니다. 이것은 이론적으로 boost::shared_ptr의 새로운 instance 마다 특수한 "삭제자(Deleter)"를 추가하는 것이지만 이것 또한 library의 아주 많은 수정을 초래합니다.
전처리 지시자 BOOST_SP_ENABLE_DEBUG_HOOKS 와 함게 컴파일을 하면 boost library는 boost의 smart pointer의 소멸자가 호출되기전에 callback hook하는 것을 추가하게 된다. 이 hook은 observer의 소멸자가 호출되기전에 observer를 사용할수 없게 하는데 사용한다. 추가적으로 boost::signals2 library [3]은 간단하고 thread-safe한 공지 메커니즘을 제공한다.
원래의 QuantLib의 observer/Observable interface에 맞춰 수정된 thread-safe 한 구현은 여기서 찾을수 있다. 모든 소스파일에 전처리지시자 BOOST_SP_ENABLE_DEBUG_HOOKS를 set 한다. QuantLib project에 observable.hpp 와 observable.cpp 파일을 교체 혹은 추가하고 QuantLib library와 QuantLib-SWIG 모듈을 다시 컴파일 한다.
http://hpcquantlib.wordpress.com/2012/02/27/quantlib-swig-and-a-thread-safe-observer-pattern-in-c/
QuantLib은 사실 Thread-Safe 하지 않습니다. 멀티코어나 병렬환경에서의 성공적인 사용은 여러 프로세스간의 message passing에 의해서 보다는 shared memory 와 multi threading 에 의해서 이루어 집니다. 만약 서로다른 thread 가 서로 다른 object에서 작동을 한다면 QuantLib 또한 Multi threading 환경에서 사용될수 있습니다.(QL_ENABLE_SESSIONS 를 정의 하는 것은 singleton을 thread에 종속적이게 만듭니다.)
만약 당신이 QuantLib을 SWIG를 통하여 Java나 Scala에서 사용한다면 설령 메인 루틴이 싱글스레드 일지라도 QuantLib 루틴은 자동적으로 multi threading 환경에서 실행되어집니다.
JVM의 가비지 컬렉터는 보통 다른 thread에서 돌고 있습니다. 이것은 QuantLib에 구현되어 있는 Observer Pattern 과 결합하여 심각한 문제를 초래 할수 있습니다. 즉, 아래의 간단한 single thread Scala 코드는 멀티코어 컴퓨터에서 짧은 시간에 충돌이 일어날수 있습니다.
import org.quantlib.{Array => QArray, _}
object ObserverTest {
def main(args: Array[String]) : Unit = {
System.loadLibrary("QuantLibJNI");
val aSimpleQuote = new SimpleQuote(0)
while (true) {
(0 until 10).foreach(_ => {
new QuoteHandle(aSimpleQuote)
aSimpleQuote.setValue(aSimpleQuote.value + 1)
})
System.gc
}
}
}
같은 객체가 동일한 시점에 aSimpleQuote.setValue 함수에 의해 update 함수가 호출될때 가비지 콜렉터는 observer의 소멸자를 호출합니다.(이 내용에 대한 QuantLib Mailing list는 여기에서 확인 할수 있습니다.). greenfield projects에서 [2]의 저자는 C++에서의 적당한 해답을 제시합니다. 안타깝게도 해당 솔루션은 QuantLib에 적용될 수 없었습니다. 해당 솔루션은 Observer pattern의 interface에 많은 변화를 주어야 하고 obsever pattern의 interface의 변경은 QuantLib library의 아주 많은 변화를 초래하기 때문이었습니다.가장 중요한 문제는 Observer 가 Destructor가 작용하기 전에 사용불능 상태가 되는것입니다. 이것은 이론적으로 boost::shared_ptr의 새로운 instance 마다 특수한 "삭제자(Deleter)"를 추가하는 것이지만 이것 또한 library의 아주 많은 수정을 초래합니다.
전처리 지시자 BOOST_SP_ENABLE_DEBUG_HOOKS 와 함게 컴파일을 하면 boost library는 boost의 smart pointer의 소멸자가 호출되기전에 callback hook하는 것을 추가하게 된다. 이 hook은 observer의 소멸자가 호출되기전에 observer를 사용할수 없게 하는데 사용한다. 추가적으로 boost::signals2 library [3]은 간단하고 thread-safe한 공지 메커니즘을 제공한다.
원래의 QuantLib의 observer/Observable interface에 맞춰 수정된 thread-safe 한 구현은 여기서 찾을수 있다. 모든 소스파일에 전처리지시자 BOOST_SP_ENABLE_DEBUG_HOOKS를 set 한다. QuantLib project에 observable.hpp 와 observable.cpp 파일을 교체 혹은 추가하고 QuantLib library와 QuantLib-SWIG 모듈을 다시 컴파일 한다.
[1] Simplified Wrapper and Interface Generator, SWIG
[2] Shuo Chen, Where Destructors meet Threads
[3] Douglas G., Mori Hess F., Boost.Signals2
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 환경에서의 사용시
윈도우 환경에서는 다음에 상응하는 전처리기를 userconfig.hpp 에 명시되어 있습니다.
이러한 작업의 이점은 Multi-threading 응용프로그램에서 서로다른 스레드 간에 SWIG/QuantLib 의 객체를 명시적으로 공유하지 않기때문에 Java/Scala/C#/F# and a thread local singleton implementation 을 위한 안정적인 SWIG Interface 입니다.
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-patternthread-safe singleton 과 thread-safe observer pattern을 사용할수 있게 한다.
윈도우 환경에서는 다음에 상응하는 전처리기를 userconfig.hpp 에 명시되어 있습니다.
#define QL_ENABLE_TSS #define QL_ENABLE_THREAD_SAFE_OBSERVER_PATTERNboost::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 입니다.
2014년 4월 17일 목요일
덧셈연산과 곱셈연산의 속도차이
평소에도 궁금하고 프로젝트의 성능을 좌지우지하는 중요한 사항이기때문에
테스트를 해봤습니다.
소스코드는 다음과 같습니다.
<<덧셈연산>>
#include <iostream>
#include <boost/chrono.hpp>
using namespace std;
int main()
{
double a = 1.0;
double b = 1.1;
boost::chrono::high_resolution_clock::time_point start, end;
start = boost::chrono::high_resolution_clock::now();
for(int i=1; i< 5001; i++)
{
a +=b;
}
end = boost::chrono::high_resolution_clock::now();
cout<<end - start<<endl;
cout<< "value is "<< a << endl;
return 0;
}
<<곱셈연산>>
#include <iostream>
#include <boost/chrono.hpp>
using namespace std;
int main()
{
double a = 1.0;
double b = 1.1;
boost::chrono::high_resolution_clock::time_point start, end;
start = boost::chrono::high_resolution_clock::now();
for(int i=1; i< 5001; i++)
{
a *=b;
}
end = boost::chrono::high_resolution_clock::now();
cout<<end - start<<endl;
cout<< "value is "<< a << endl;
return 0;
}
제 환경에서는 결과가 다음과 같습니다.
덧셈이 빠른가 봅니다.. 이유는 멀까요? 부동소숫점 연산이라 곱셈이 빠를것 같았는데..
테스트를 해봤습니다.
소스코드는 다음과 같습니다.
<<덧셈연산>>
#include <iostream>
#include <boost/chrono.hpp>
using namespace std;
int main()
{
double a = 1.0;
double b = 1.1;
boost::chrono::high_resolution_clock::time_point start, end;
start = boost::chrono::high_resolution_clock::now();
for(int i=1; i< 5001; i++)
{
a +=b;
}
end = boost::chrono::high_resolution_clock::now();
cout<<end - start<<endl;
cout<< "value is "<< a << endl;
return 0;
}
<<곱셈연산>>
#include <iostream>
#include <boost/chrono.hpp>
using namespace std;
int main()
{
double a = 1.0;
double b = 1.1;
boost::chrono::high_resolution_clock::time_point start, end;
start = boost::chrono::high_resolution_clock::now();
for(int i=1; i< 5001; i++)
{
a *=b;
}
end = boost::chrono::high_resolution_clock::now();
cout<<end - start<<endl;
cout<< "value is "<< a << endl;
return 0;
}
제 환경에서는 결과가 다음과 같습니다.
| 회차 | 덧셈 | 곱셈 |
| 1 | 4226 | 6943 |
| 2 | 4226 | 7244 |
| 3 | 4528 | 7245 |
| 4 | 4226 | 7244 |
| 5 | 4528 | 7244 |
덧셈이 빠른가 봅니다.. 이유는 멀까요? 부동소숫점 연산이라 곱셈이 빠를것 같았는데..
예상 외입니다.
피드 구독하기:
글 (Atom)