etc/연구실 인턴

MPI & Matrix Tiling

uyt8989 2022. 5. 2. 23:24

MPI 공부 중...

 

WIKI

 

Message Passing Interface - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Message-passing system for parallel computers This article needs to be updated. The reason given is: MPI-4.0 was approved by the MPI Forum in June 2021. Please help update this article

en.wikipedia.org

MPI 라이브러리

MPICH

 

MPICH | High-Performance Portable MPI

MPICH is a high performance and widely portable implementation of the Message Passing Interface (MPI) standard. MPICH and its derivatives form the most widely used implementations of MPI in the world. They are used exclusively on nine of the top 10 superco

 

www.mpich.org

OpenMPI

 

Open MPI: Open Source High Performance Computing

 

www.open-mpi.org

 

OpenMP와 OpenMPI & MPICH 차이

둘 다 분산 프로그래밍을 위한 도구. 하지만 memory를 공유하느냐 안 하느냐의 차이가 있다.

OpenMP는 shared memory를 지원하지만 OpenMPI랑 MPICH는 distributed memory이다.

 

OpenMPI와 MPICH 차이

둘은 비슷하지만 목적성에 조금 차이가 있다는데, 내가 읽은 글이 무려 12년 전에 포스팅됐기 때문에 현재는 어떤지 모르겠다. 조금 더 찾아보니 내가 하는 수준에서는 어떤 것으로 하나 유의미한 차이가 있어 보이지 않는다. 그래서 그냥 조금 더 일반적이라는 OpenMPI를 선택했다.

Matrix Tiling

MPI를 공부하는 궁극적인 이유는 MPI + Matrix Tiling를 통한 행렬의 병렬 곱셈에다가 CSD까지 사용하기 위함이다. 이 삼중 콤보를 통해서 행렬 곱셈의 성능을 어디까지 증가시킬 수 있을까를 알아보고자 한다. Matrix Tiling에 대해 공부를 조금 해보니 보통 CUDA에서 잘 사용하는 것 같았다. 이 방법의 핵심은 공유 메모리를 사용해서 스레드 당 글로벌 메모리 접근을 줄이는 것이다. 하지만 내가 사용하려고 하는 OpenMPI는 공유 메모리를 지원하지 않는다. 오히려 분산 메모리가 핵심인데... 그래서 생각한 건 각 스레드마다 행렬의 전부를 저장하지 말고 필요한 부분만 올려서 계산하면 되지 않을까 하는 생각이 들었다. 대충 행렬을 4개로 나누는 경우엔 결과 값의 (0,0) 부분을 구하기 위해선 입력 행렬의 1/4씩만 올리면 된다. 이런 방법이라면 효과가 있을지도 모르겠다. 공유 메모리랑 분산 메모리를 둘 다 사용하는 방법이 있으면 더 좋을 것 같다. 

구글에 Parallel Matrix Multiplication MPI 이렇게 검색하면 코드가 몇 개 나온다. 처음엔 와! 했지만 막상 코드 해킹을 해보니 아주 단순하게 구현되어 있었다. 이렇게 Tiling은 전혀 하지 않았고 그냥 A 행렬만 대충 나누고 B 행렬은 Broadcasting 되어 있었다. 그냥 API를 어떻게 사용하는지 감 잡는 선에서만 도움을 받을 수 있을 것 같다.

 

5/15 추가)

이 방법을 사용하면 디스크에 저장하거나 계산을 위해 메모리에 올릴 때 중복이 발생하게 된다. 이 주제로 석사분이랑 대화를 나눠봤지만 딱히 좋은 아이디어는 없었던 것 같다. 일단은 Host에서 스레드를 여러 개 띄우는 코드부터 작성하기로 했다. 이후엔 Newport CSD 1개를 사용해서 Host랑 CSD 간의 로드 비율을 수정해가면서 최적의 성능을 찾아보기로 결정했다.

그래도 나름의 진전이라면 파일을 여러 개로 쪼개서 저장하기로 했다. 파일을 하나로 저장하는 경우보다 타일링하는데에 이점이 훨씬 많을 것 같았다. 그리고 파일 읽는 오버헤드를 최대한 감소시키기 위해서 바이너리 파일을 사용해서 해당 아이디어를 실제로 구현하는 중이다. 그리고 최종적으로는 다른 PC와도 MPI가 가능하도록 구현해야 하는데 이건 아직 어떤 방식으로 작동하는 건지 잘 몰라서 공부해야 한다.

 

5/26 추가)

CSD를 클러스터로 사용하기 위해서는 mpirun에 옵션을 달아야 한다.

 

mpirun(1) man page (version 3.0.6)

« Return to documentation listing Table of Contents orterun, mpirun, mpiexec - Execute serial and parallel jobs in Open MPI. oshrun, shmemrun - Execute serial and parallel jobs in Open SHMEM. Note: mpirun, mpiexec, and orterun are all synonyms for each ot

www.open-mpi.org

 

reference)

https://www.quora.com/What-is-the-difference-between-OpenMP-and-Open-MPI

https://stackoverflow.com/questions/2427399/mpich-vs-openmpi

https://www.quora.com/What-is-the-difference-between-Mpich-and-OpenMPI

https://penny-xu.github.io/blog/tiled-matrix-multiplication

 

'etc > 연구실 인턴' 카테고리의 다른 글

Newport CSD  (0) 2022.06.29
PageRank Algorithm  (0) 2022.01.13
Samsung SmartSSD  (0) 2022.01.08
연구실 인턴 시작  (0) 2022.01.08