본문 바로가기

전체 글

(18)
병렬계산 6. MPI 1 간단한 hello world 예시를 통해 MPI에서 꼭 포함되어야 하는 것들을 살표본다. #include #include using std::cout;int main(int argc, char **argv){ int rank, size; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (rank == 0){ cout rank는 프로세스의 번호라고 생각하면 되고, size는 프로세스의 개수이다. MPI_Init은 이제부터 MPI를 사용한 병렬 프로그램을 시작하겠다고 MPI에 알리는 것이다. 그리고 MPI에서는 결과를 저장하거나 입력값을 수정해야 하는 경우가 많아서 보통..
병렬계산 5. MPI 0 이전에 OpenMP를 했고, 이제 MPI를 공부하는데, 사실 어디 가서 병렬계산을 한다고 했을 때, OpenMP나 쿠다는 못해도 병렬계산을 한다고 할 수 있다. 그러나 MPI를 못하면 병렬계산을 한다고 말할 수 없다고 교수님이 그러시더라. 실제로 나도 내 모델링에서 OpenMP나 쿠다는 안써봤는데 MPI는 항상 쓴다. MPI의 여러 가지 장점을 얘기하자면 다음과 같다. 먼저 universality이다. 쉽게 말해서 어느 아키텍쳐의 컴퓨터에서든 사용 가능하다는 것이다. 슈퍼컴퓨터에서는 당연히 사용 가능하고, 워크스테이션 같은 고성능 공유메모리 컴퓨터나, PC 클러스터와 같은 분산 메모리 환경에서도 모두 사용이 가능하다. 이전에 공부했던 OpenMP는 공유메모리 아키텍쳐에서만 사용이 가능했던 것을 생각하면,..
병렬계산 4. Jacobi Iteration 병렬화 병렬 코드를 쓰려면 일단 serial 코드를 써보는 게 좋다. 그런데 잠깐 여담으로, 병렬의 counterpart인 serial을 얘기할 때, 나는 주로 순차 또는 직렬이라고 안하고 serial이라고 하게 된다. 사실 serial computing의 의미를 생각하면 순차계산이라고 하는 것이 맞다. 그런데 이거는 병렬이라는 단어랑 라임이 별로 안맞아서 counterpart로 쓰기에는 별로 마음에 안든다. 그리고 간혹가다가 직렬계산이라고 하는 사람들도 있는데, serial computing이 하나 계산하고 그 다음에 하나 계산하고 이런 의미를 갖고 있어서 단순히 일렬로 연결되어있다는 의미의 직렬을 쓰기에는 의미상 거부감이 든다. 그렇다고 시리얼/씨리얼 이라고 한국말로 쓰면 좀 콘푸라이트 생각도 나고 단어의 ..
병렬계산 3. OpenMP2 for문 앞에 parallel 디렉티브를 써주면 loop를 여러 스레드로 나눠서 처리하게 된다. 그리고 loop의 모든 부분을 다 처리하고 넘어가는 게 일반적으로 좋으니까 병렬 블록이 끝나는 부분에 눈에 보이지 않는 barrier가 있다. 이게 싫으면 nowait clause를 쓰면 되는데, 이 경우에 먼저 일을 마친 스레드는 기다리지 않고 병렬 블록을 벗어나서 다른 일을 하러 간다. 다음과 같이 쓰면 된다.#pragma omp for nowait for (i=0; i루프를 쪼개는 방법은 디폴트는 컴파일러에서 정해져있긴 하지만, schedule clause를 통해 내가 조절할 수도 있다. schedule(type [, chunk size])와 같이 쓰면 되는데, 먼저 type 중 static은 전체 ta..
병렬계산 2. OpenMP1 OpenMP는 Open Multi-Processing이라는 API로, 공유 메모리 환경에서 multi-processing을 할 수 있게 해주는 것이다. 주요 기능은 multi-threading이고, 포트란/C/C++에서 지원된다고 한다. 스레드는 스케줄러에 의해서 통제되는 여러 명령들의 가장 작은 단위이다. 즉, 스케줄러에 의해서 컨트롤되는 task를 의미한다. OpenMP에서는 여러 스레드가 하나의 프로세스에 존재할 수 있고, 스레드는 프로세스의 자원을 공유하고, 스레드는 동시에 실행될 수 있고, 스레드는 자기 자신의 private variables을 가질 수 있다. 몇몇 CPU는 하이퍼스레딩을 지원한다. 병렬계산을 할 때, master 스레드가 여러 개의 slave 스레드를 생성하는 과정을 fork라..
병렬계산 1. Basics Serial과 Parallel의 차이는 간단히, serial computing은 하나의 코어에서 명령을 순차적으로 실행하는 것. 한 번에 하나의 task를 처리함. Parallel은 작업 (instruction or data)을 여러 부분으로 나눠서 여러 코어에서 동시에 처리하는 방식. Parallel을 쓰는 가장 큰 이유는 계산 시간을 줄이는 것. 2005년 이후로 물리적 한계로 인해 CPU의 클럭을 높이는 것이 매우 어려워져서, 코어 여러 개를 쓰는 것으로 발전해왔다. 또 다른 이유는 여러 작업이 동시에 진행되고 동시에 끝나도록 하는 concurrency를 병렬 계산을 통해 구현할 수 있다. 그리고 대량의 데이터에 대한 작업을 하는 경우에, 컴퓨터의 메모리에 제한이 있을 경우 데이터를 여러 컴퓨터에 ..
Immersed Boundary Method - 3. Equations of Motion 앞선 글에서 action $S$를 최소화하기 위해서 변분 $\wp S$를 유도하였고, 이 변분의 제약인 $dJ/dt=0$을 라그랑지안 좌표계에서 그대로 다루는 것이 어렵기때문에 라그랑지안 좌표 $\mathbf{X}$의 변분 $\wp \mathbf{X}$에 대응하는 pseudo-velocity $\mathbf{v}$를 도입하여서 incompressibility가 오일러리안 좌표계에서$$\nabla \cdot \mathbf{v} = 0$$와 같이 표현될 수 있음까지 유도하였다. 이제 라그랑지안 변수의 적분으로 표현된 $\wp \mathbf{S}$를 오일러리안 변수를 도입하여서 나타낼 준비가 된 것이다. 라그랑지안 변수를 오일러리안 변수로 표현하는데 Dirac 델타 함수를 사용하는데, 먼저 다음의 두 식은 쉽..
Immersed Boundary Method - 2. Principle of Least Action과 Incompressibility 지난 글의 힘과 에너지의 관계에 이어서, 이번에는 이런 힘이 가해질 때 실제 물체[여기서는 비압축성 탄성체]가 어떻게 움직이는지를 소개하는 Equations of motion이다. 힘이 가해질 때 운동을 기술하는 방법이 몇 가지 있을 수 있는데, 그거는 살짝 뒤에 소개하기로 하고 먼저 비압축성 탄성체라는 말을 수학적으로 표현하면서 시작한다. Material의 label을 나타내는 라그랑지안 좌표계 $(q,r,s)$에서 $\mathbf{X}(q,r,s,t)$가 그 label에 해당하는 실제 점의 물리적 위치일 때, 라그랑지안 좌표 공간에서 다음과 같은 구간에 의해 bound되는 아주 작은 직육면체를 생각하자.$$\left[q, q+dq \right] \times \left[r, r+dr \right] \t..