|
요즘 PC에 GPU 없는 PC가 없는데
Visual C++ 컴파일러 이용하면 쿠다 같은 것도 필요 없고, GPU 디버깅도 지원됨 ㅋ
최용옥 님이 쓰신 글 :
: 답변 감사드립니다.
:
: 제 직업의 특성상, 제가 짠 프로그램을 공개하고, 다른 사람들에게도 배포를 해야합니다. 일단 일반유저들이 사용할수 있는 방법을 찾고 있습니다. 제 동료중에서도 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연산 코드를 생성하게 되어 연산 속도가 엄청 빠르게 됨.
: :
: :
|