본문 바로가기

프로그래밍206

[OpenMP] 사다리꼴 공식 (trapezoidal rule) Refenences An Introduction to Parallel Programming Contents 사다리꼴 공식 (trapezoidal rule) ciritical 디렉티브 변수의 범위(scope) reduction 디렉티브 parallel for 디렉티브 2021.11.09 - [프로그래밍/병렬프로그래밍] - [MPI] 사다리꼴 공식 (trapezoidal rule) 병렬화 - 1 이번 포스팅에서는 MPI에서 살펴봤던 사다리꼴 공식을 OpenMP로 어떻게 구현할 수 있는지 다양한 버전으로 알아보겠습니다. 사다리꼴 공식은 x축과 x=a와 b의 f(x) 그래프 사이의 면적을 구하는 공식으로, x축을 n개의 서브 인터벌로 나누고 사다리꼴 넓이 공식을 통해 각 서브 인터벌의 면적을 추정하는 것입니다... 2021. 11. 21.
[OpenMP] Hello, OpenMP References An Introduction to Parallel Programming Contents OpenMP 기본 예제 에러 체크 OpenMP Pthreads와 같이 OpenMP는 공유 메모리 병렬 프로그래밍을 위한 API입니다. OpenMP에서 MP는 multi-processing을 의미합니다. OpenMP는 각 스레드나 프로세스가 제약없이 메모리를 액세스할 수 있도록 설계되어 있고, OpenMP로 프로그래밍할 때, 시스템을 CPU나 코어의 집합으로 바라볼 수 있도록 합니다. 이 시스템에 속한 모든 CPU나 코어는 다음 그림처럼 메인 메모리를 액세스할 수 있습니다. OpenMP와 Pthreads 모두 공유 메모리 프로그래밍을 위한 API이지만, Pthreads는 개발자가 명시적으로 각 스레드.. 2021. 11. 20.
[pthread] 배리어(Barrier)와 조건 변수(Condition Variable) References An Introduction to Parallel Programming Contents 배리어(Barrier) 조건 변수(Condition Variable) 2021.11.18 - [프로그래밍/병렬프로그래밍] - [pthread] Thread 동기화 이전 포스트에서 메세지 전송 프로그램을 작성하며 스레드 동기화에 대해서 알아봤습니다. 프로그램에서 스레드들이 동일한 포인트에 있는지 확인하여 동기화할 수 있었습니다. 어떠한 스레드도 모든 스레드가 이 포인트에 도달할 때까지 진행될 수 없으므로 동기화의 이런 포인트 지점을 배리어(Barrier)라고 합니다. 배리어는 여러 어플리케이션에서 다양하게 사용됩니다. 이전 MPI 프로그래밍에서 성능 측정을 위해 각 스레드의 수행 시간을 측정할 때, .. 2021. 11. 19.
[pthread] Thread 동기화 References An Introduction to Parallel Programming Contents Semaphore (세마포어) Producer-Consumer Synchronization 각 스레드는 다른 스레드로 '메세지 전송'을 수행하고 전송받은 메세지를 출력하는 프로그램을 작성한다고 가정해봅시다. 예를 들어, t개의 스레드가 있을 때, 스레드 0은 스레드 1로 메세지를 전송하고 스레드 1은 스레드 2로 메세지를 전송합니다. 즉, 스레드 t-2는 스레드 t-1에게 메세지 전송하고 스레드 t-1은 스레드 0에게 메세지를 전송합니다. 그리고 스레드는 메세지를 수신한 후에 수신받은 메세지를 출력하고 스레드를 종료합니다. 메세지 전송을 구현하기 위해서 char* 타입의 공유 배열을 할당하고, 각 .. 2021. 11. 18.
[pthread] Critical Section References An Introduction to Parallel Programming Contents PI 값 구하기 Critical Section (크리티컬 섹션) Busy waiting Mutex (뮤텍스) 행렬-벡터 연산 코드는 꽤 쉽게 작성했습니다. 이는 공유 메모리 위치를 쉽게 액세스할 수 있기 때문입니다. 초기화 이후에, y를 제외한 모든 변수들은 각 스레드에서 쉽게 접근할 수 있습니다. 즉, y를 제외한 모든 공유 변수들은 main 스레드에서 초기화된 이후에 변경될 수 없다는 것을 의미합니다. 게다가 y에 대해서 무언가 변경을 하려고 하더라도 오직 하나의 스레드만이 개별 컴포넌트를 변경할 수 있습니다. 따라서 두 스레드(혹은 그 이상)가 하나의 컴포넌트를 변경하지 않습니다. 잘 아시겠지.. 2021. 11. 17.
[pthread] 행렬 - 벡터 곱 연산 (+ 캐시 일관성, 거짓 공유) References An Introduction to Parallel Programming Contents 행렬-벡터 곱 연산 병렬화 Cache, Cache Coherence, False Sharing 이전에 MPI를 통해서 행렬-벡터 곱 연산을 병렬화하고 그 성능을 평가해보았습니다. 2021.11.12 - [프로그래밍/병렬프로그래밍] - [MPI] 행렬 - 벡터 곱 연산 + 성능 평가 [MPI] 행렬 - 벡터 곱 연산 + 성능 평가 References An Introduction of Parallel Programming Contents 행렬 - 벡터 곱 연산 MPI_Allgather MPI_Wtime, MPI_Barrier 이번에는 행렬-벡터 곱 연산을 MPI를 사용하여 병렬화해보도록 하겠습니다. \.. 2021. 11. 16.
[pthread] Hello, Pthreads References An Introduction to Parallel Programming Contents 공유 메모리 시스템 프로세스, 스레드 그리고 pthreads Hello, Pthreads 개발자 입장에서 공유 메모리 시스템은 모든 코어가 모든 메모리 위치에 접근할 수 있습니다. 그러므로 공유 메모리 시스템에서의 접근 방법은 특정 메모리 위치를 "공유"하도록 설정하는 것입니다. 이는 병렬 프로그래밍에서 당연한 방법입니다. 그러나 앞으로 pthread에 대해서 알아보면서 공유 메모리 시스템에서 프로그래밍할 때 문제가 있다는 것을 알아보도록 할 것입니다. 이러한 문제점들은 분산 메모리 프로그램에서 발생한 문제와는 조금 다릅니다. 프로세스, 스레드, Pthreads 스레드(thread)는 MPI 프로그.. 2021. 11. 15.
[MPI] Odd-even transposition sort (MPI Safety) References An Introduction to Parallel Programming Contents Odd-even transposition sort MPI Safety, MPI_Ssend MPI_Sendrecv 성능 측정 및 비교 분산 메모리 환경에서 병렬 정렬 알고리즘은 무엇을 의미할까요 ? 무엇이 '입력'이 되고, 무엇이 '출력'이 될까요? 이는 정렬하고자하는 키(key)에 달려 있습니다. 프로세스 간에 분산된 키를 가지고 시작하거나 하나의 프로세스에 할당된 키로 시작할 수도 있습니다. 이번 포스팅에서는 프로세스 간 분산된 키를 사용하는 정렬 알고리즘을 살펴보겠습니다. 만약 n개의 키가 있고, 프로세스 p = comm_sz개가 있다면, 각 프로세스에 \(\frac{n}{p}\)개의 키를 할당.. 2021. 11. 13.
[MPI] MPI Derived Datatypes (파생 데이터타입) References An Introduction to Parallel Programming Contents MPI Derived Datatypes MPI_Type_create_struct, MPI_Type_commit, MPI_Type_free 분산 메모리 시스템에서의 통신은 로컬 연산보다 훨씬 cost가 큽니다. 예를 들어, 한 노드에서 다른 노드로 double형을 전송하는 것은 노드의 로컬 메모리에 저장된 두 개의 double형을 덧셈하는 것보다 훨씬 더 시간이 많이 걸립니다. 게다가, 다중 메세지에서 고정된 양의 데이터를 전송하는 cost는 보통 하나의 메세지에서 동일한 양의 데이터를 전송하는 것보다 훨씬 큽니다. 따라서, 하나의 send/recieve 쌍보다 다음의 for 루프가 훨씬 느릴 것으로.. 2021. 11. 13.
[MPI] 행렬 - 벡터 곱 연산 + 성능 평가 References An Introduction to Parallel Programming Contents 행렬 - 벡터 곱 연산 MPI_Allgather MPI_Wtime, MPI_Barrier 이번에는 행렬-벡터 곱 연산을 MPI를 사용하여 병렬화해보도록 하겠습니다. \(\text{A}\)가 m x n 행렬이고, \(\textbf{x}\)가 n개의 컴포넌트를 갖고 있는 벡터라면, \(\textbf{y} = \text{A}\textbf{x}\)는 m개의 컴포넌트를 갖는 벡터가 됩니다. 그리고 y의 i번째 컴포넌트는 행렬 A의 i번째 행과 x의 dot product로 계산할 수 있습니다. 이 연산을 시리얼로 의사 코드를 작성하면, 다음과 같습니다. 위 코드는 일반적인 C코드입니다. 위에서 행렬을 표현하기.. 2021. 11. 12.