C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[69664] Re:Re: Visual 2012 C++ 컴파일러가 지원하는 GPU Parallel 연산 기능을 이용하면 굉장히 빠름
최용옥 [] 3757 읽음    2013-06-18 13:06
답변 감사드립니다.

제 직업의 특성상, 제가 짠 프로그램을 공개하고, 다른 사람들에게도 배포를 해야합니다. 일단 일반유저들이 사용할수 있는 방법을 찾고 있습니다. 제 동료중에서도 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연산 코드를 생성하게 되어 연산 속도가 엄청 빠르게 됨.
:
:

+ -

관련 글 리스트
69661 매트랩 numerical optimization의 효율성을 개선하는 작업에 관심있으신 분을 수소문 합니다. 최용옥 3417 2013/06/18
69663     Re: Visual 2012 C++ 컴파일러가 지원하는 GPU Parallel 연산 기능을 이용하면 굉장히 빠름 지나다가 28395 2013/06/18
69664         Re:Re: Visual 2012 C++ 컴파일러가 지원하는 GPU Parallel 연산 기능을 이용하면 굉장히 빠름 최용옥 3757 2013/06/18
69665             Re:Re:Re: Visual 2012 C++ 컴파일러가 지원하는 GPU Parallel 연산 기능을 이용하면 굉장히 빠름 지나다가 3682 2013/06/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.