본문 바로가기

프로그래밍206

[MPI] 데이터 분산 (벡터합 병렬화) References An Introduction to Parallel Programming Contents 데이터 분산(distribution) MPI_Scatter, MPI_Gather 이번에는 MPI에서 벡터의 합을 어떻게 구하는지 살펴보도록 하겠습니다. 아래처럼 벡터의 합을 계산하는 함수를 작성한다고 가정해봅시다. \[\begin{align*}\textbf{x} + \textbf{y} &= (x_0, x_1, \cdots, x_{n-1}) + (y_0, y_1, \cdots, y_{n-1}) \\ &= (x_0 + y_0, x_1 + y_1, \cdots, x_{n-1} + y_{n-1}) \\ &= (z_0, z_1, \cdots, z_{n-1}) \\ &= \textbf{z} \end{align.. 2021. 11. 11.
[MPI] 사다리꼴 공식 (trapezoidal rule) 병렬화 - 2 References An Introduction to Parallel Programming Contents Collective Communication (집합 통신) MPI_Reduce, MPI_Allreduce, MPI_Bcast 이전 글에서 MPI로 사다리꼴 공식을 병렬화하여 코드를 작성해봤습니다. 2021.11.09 - [프로그래밍/병렬프로그래밍] - [MPI] 사다리꼴 공식 (trapezoidal rule) - 1 하지만 작성한 코드에서 각 프로세스들은 연산을 수행하고 그 연산 결과를 합하기 위하여 프로세스 0에게 결과를 전달하고, 프로세스 0에서 모든 결과를 더하는 작업을 수행합니다. 이전 글 마지막에 언급했듯이 이러한 작업이 최선이 아니고, 성능을 향상시킬 수 있는 여지가 남아있습니다. 트리 .. 2021. 11. 10.
[MPI] 사다리꼴 공식 (trapezoidal rule) 병렬화 - 1 References An Introduction to Parallel Programming Contents Trapezoidal rule 병렬화 I/O의 처리 사다리꼴 공식 (trapezoidal rule) 이번에는 MPI를 사용하여 사다리꼴 공식(trapezoidal rule)을 병렬화해보도록 하겠습니다. 사다리꼴 공식은 적분을 근사하는 수치적분 방법인데, 적분이 나타내는 넓이를 일련의 사다리꼴들의 넓의의 합으로 근사합니다. (참고 : 위키백과) 우리는 이 사다리꼴 규칙을 사용하여 \(y = f(x)\)라는 함수에 대한 그래프 사이의 영역에 대한 넓이의 근사값을 구해볼 것입니다. 기본적인 아이디어는 x축의 내부를 n개의 동일한 서브인터벌(subinterval)로 구분합니다. 그리고, 그래프와 각 서브인.. 2021. 11. 9.
[MPI] Hello, MPI References An Introduction to Parallel Programming Contents MPI (Message-Passing Interface) MPI 프로그램(MPI_Init, MPI_Finalize, Communicator, MPI_Comm_size, MPI_Comm_rank) SPMD 프로그램 communication(MPI_Send, MPI_Recv, 메세지 매칭) MPI (Message-Passing Interface) MPI(메세지 인터페이스)는 분산 및 병렬 처리에서 정보의 교환에 대해 기술하는 표준입니다. MPI는 분산 메모리 시스템에서 사용할 수 있도록 프로그래밍할 수 있도록 기본적인 기능들과 문법, 프로그래밍 API에 대해 기술하고 있습니다. 메세지 패싱(messag.. 2021. 11. 8.
병렬 프로그래밍 References An Introduction to Parallel Programming (Peter Pacheco) Contents 병렬 프로그램이 필요한 이유 병렬 프로그램을 작성하는 방법 공유 메모리(shared-memory)와 분산 메모리(distributed-memory) 병렬 프로그래밍이 필요한 이유 싱글 프로세서 성능의 증가는 집적회로(intergraed circuit;IC)의 트랜지스터, 즉 전자회로의 밀집도 증가에 기인합니다. 트랜지스터의 크기가 작아질수록 트랜지스터의 속도는 증가되며, 집적회로의 전체 속도도 증가됩니다. 그러나 트랜지스터 속도의 증가는 전력 소모도 증가시킵니다. 이 전력 대부분은 열로 발산되며, 집적회로가 뜨거워지면 그 회로의 기능에 대한 신뢰성이 떨어집니다. 그러므로.. 2021. 11. 7.
[C++] 비동기(Asynchronous) 실행 References 씹어먹는 C++ (https://modoocode.com/284) Contents std::future, std::promise std::shared_future std::packaged_task std::async 앞선 글들에서 이야기했던 쓰레드나 생성자-소비자 패턴의 경우을 사용하는 경우는 결국 프로그램의 실행이 한 갈래가 아닌 여러 갈래로 갈라져서 동시에 진행되어서 CPU를 조금 더 효율적으로 사용하기 위해서입니다. 즉, 프로그램을 비동기적(asynchronous) 실행을 하기 위해서 입니다. 이번 글에서는 이러한 비동기적 실행을 간단하게 구현할 수 있도록 도와주는 도구/기능들에 대해서 알아보겠습니다. std::future / std::promise 비동기적 실행을 통해서 하고 .. 2021. 8. 14.
[C++] Perfect Forwarding References 씹어먹는 C++ (https://modoocode.com/228) http://thbecker.net/articles/rvalue_references/section_07.html Effective Modern C++ (항목 28) Contents Perfect Forwading Universal Reference (보편 참조) 참조 축약(Reference Collapsing) std::forward 우측값 참조와 우측값 참조를 도입함으로써 해결할 수 있었던 Move Semantics의 관한 글에 이어서 이번 글에서는 Perfect Forwading에 대해서 알아보겠습니다. 2021.08.11 - [C & C++] - [C++] 우측값 참조(rvalue reference) [C++] 우.. 2021. 8. 13.
[C++] Move Semantics References 씹어먹는 C++ (https://modoocode.com/228) http://thbecker.net/articles/rvalue_references/section_07.html Contents Move Semantics(std::move) 2021.08.11 - [C & C++] - [C++] 우측값 참조(rvalue reference) [C++] 우측값 참조(rvalue reference) References 씹어먹는 C++ (https://modoocode.com/227) http://thbecker.net/articles/rvalue_references/section_07.html Contents 복사 생략(Copy Elision) 좌측값(lvalue)와 우측값(rvalue) .. 2021. 8. 12.
[C++] 우측값 참조(rvalue reference) References 씹어먹는 C++ (https://modoocode.com/227) http://thbecker.net/articles/rvalue_references/section_07.html Contents 복사 생략(Copy Elision) 좌측값(lvalue)와 우측값(rvalue) 우측값 레퍼런스(rvalue reference) 이동 생성자(move constructor) STL Container에서 사용할 때 주의할 점 요즘 threadpool 구현을 해보기 위해서 thread와 관련된 여러가지를 공부하다보니 컴파일 에러나 경고에서 자주 봤던 rvalue에 대해서도 조금씩 나오고, C++을 조금 더 효율적으로 사용하기 위해서 어느 정도 개념은 잡아야 한다고 생각이 들어서 우측값 참조에 대해.. 2021. 8. 11.
[C++] 생산자(Producer) / 소비자(Consumer) 패턴 References 씹어먹는 C++ (https://modoocode.com/270) Contents 생산자 / 소비자 패턴 Producer - Consumer 패턴 예시 생산자(Producer) - 소비자(Consumer) 패턴은 멀티 쓰레드 프로그램에서 자주 사용되는 패턴입니다. 여기서 생산자(producer)는 무언가 처리할 일을 받아오는 쓰레드를 의미합니다. 예를 들어, 웹사이트를 다운로드하여 분석하는 프로그램을 만들었다고 가정한다면, 이 경우 웹사이트를 다운로드하는 쓰레드가 생산자가 됩니다. 소비자(consumer)는 받은 일을 처리하는 쓰레드를 의미하며, 앞의 예에서 다운로드 받은 웹페이지를 분석하는 쓰레드가 소비자 역할을 하게 됩니다. 위와 같은 예시를 쓰레드로 구현해보겠습니다. #inclu.. 2021. 8. 9.