|
최용옥 님이 쓰신 글 :
: 혹시 제 글이 이 포럼의 게시판에 맞지 않는 글이라면 사과를 드립니다. 제가 듣기로 Matlab과 C++를 연동하면 속도 개선이 가능하다고 들어서 여기 전문가들의 조언을 구하고자 합니다.
:
: 저는 계량경제학자입니다. 제 지금 연구 프로젝트의 결과물이 numerical optimization으로 계산이 되며 Matlab(m file)으로 작성이 되어 있습니다. Object function의 값을 evaluate 할 때, statistics toolbox에 있는 mvncdf (Multivariate normal cumulative distribution function)을 자주 사용하는데, 이 부분을 효과적으로 계산하도록 프로그램을 개선하는 일입니다. 현재는 가능한 parameter 범위에 대해서 mvncdf의 값을 저장하여 mat 형식의 행렬로 저장한 뒤에 이를 불러들여서 계산하고 있습니다. 이 방법은 속도가 만족할만큼 빠르지 않고, 행렬의 크기가 꽤 크고(1Gb), optimization에서 derivative를 이용하는 방법을 사용하지 못한다는 문제점이 있어서 개선하고자 합니다. 더 자세한 내용을 알고 싶으시면 연락주십시오.
:
:
행렬 크기가 1Gb나 되는 수치연산을 CPU에 의존하는 방법은 너무 느리고, 그런 경우 GPU Parallel 연산 기능을 이용해야 하는데
Visual Studio 2012 C++ 컴파일러가 지원하는 GPU Parallel 연산 기능을 이용하면 굉장히 빠르게 연산할 수 있음.
for (int row = 0; row < BIG_ROW; row++) {
for (int col = 0; col < BIG_COL; col++) {
for (int inner = 0; inner < INNER_N; inner++) {
product[row][col] += aMatrix[row][inner] * bMatrix[inner][col];
}
}
거대한 크기의 행렬 프로덕트를 위와 같은 코드패턴으로 CPU에 의존하게 된다면 설령 쓰레드를 이용해도 연산 시간이 엄청 걸리지만
Visual Studio 2012 C++ 컴파일러를 이용하면 다음과 같이 Lamda expression을 이용할 수도 있고
int aMatrix[] = { ........... };
int bMatrix[] = { ........... };
int productMatrix[] = { ....... };
array_view<int, K> a(N, M, aMatrix);
array_view<int, K> b(N, M, bMatrix);
array_view<int, K> product(T, T, productMatrix);
parallel_for_each(
product.extent,
[=](index<K> idx) restrict(amp) {
int row = idx[0];
int col = idx[1];
for (int inner = 0; inner < INNER_N; inner++) {
product[idx] += a(row, inner) * b(inner, col);
}
}
);
VS2012 C++ 컴파일러가 parallel_for_each 구문을 파싱해서 GPU Parallell연산 코드를 생성하게 되어 연산 속도가 엄청 빠르게 됨.
윈도우즈 플렛폼에서 Visual Studio C++ 컴파일러가 가장 많이 사용되는 데는 다 이유가 있는 것임.
|