|
답변 감사드립니다.
제 직업의 특성상, 제가 짠 프로그램을 공개하고, 다른 사람들에게도 배포를 해야합니다. 일단 일반유저들이 사용할수 있는 방법을 찾고 있습니다. 제 동료중에서도 Matlab과 GPU를 이용하는 친구가 있긴 한데, 그런 방식은 GPU를 이용한 컴퓨터를 구성하지 않으면 힘들어서 일반 경제학자들이 사용하기가 어려울 것 같습니다.
감사드립니다.
지나다가 님이 쓰신 글 :
: 최용옥 님이 쓰신 글 :
: : 혹시 제 글이 이 포럼의 게시판에 맞지 않는 글이라면 사과를 드립니다. 제가 듣기로 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연산 코드를 생성하게 되어 연산 속도가 엄청 빠르게 됨.
:
:
|