분산 메모리 연산이란?
//
이전 포스팅에서 공유메모리 연산에 대해서 설명을 한 적이 있습니다. 이번 글에서는 분산메모리 연산에 대하여 설명을 하도록 하겠습니다.
프로세스와 클러스터
우리는 공유메모리 연산이 노드(컴퓨터)내부에서 프로그램 동작을 병렬로 실행되는 작은 작업들로 나누기 위해 스레드들을 이용한다는 것을 알고 있습니다. 이러한 스레드는 메모리의 특정부분을 공유하므로, 공유메모리 연산이라고 불리어 집니다. 그에 반해서, 분산메모리 연산의 병렬화는 다른 프로세스가 접근할 수 없는 독립된 메모리공간을 가진 다중 스레드들을 다수의 프로세스가 실행하여 만들어 집니다. 다수의 컴퓨터에 걸쳐 분산되어있는 모든 프로세스들은 병렬메모리 접근에서 병렬 프로그램을 구성하는 작은 부분들입니다.
간단히 말해서, 병렬 연산에서 메모리 들은 공유되는 것이 아니라, 분산됩니다.
분산 연산에 대하여 이해하기 위해서는 클러스터 컴퓨팅의 기본 개념을 이해할 필요가 있습니다. 단일 컴퓨터의 메모리와 연산력은 제한이 있으므로, 이러한 메모리와 연산능력을 향상시키기 위하여, 과학자들은 여러 대의 컴퓨터를 연결하여 사용하는 컴퓨터 클러스터를 사용하기 시작하였습니다.
문제의 분할
컴퓨터 클러스터링을 위해 모델을 물리적으로 나누는 과정은 아주 복잡합니다. 모든 모델(문제)는 데이터를 나누고, 작업을 분산시키기 위한 조각들로 나누어 져야 합니다. 예를 들어 거대한 배열로 이루어진 행렬형태의 문제를 살펴보겠습니다. 이러한 배열은 서로 독립적이나 중복된 블록들로 나누어 질 수 있고, 각 프로세스들은 각각의 독립된 블록들을 다룹니다. 물론 각 블록들의 동작들과 데이터는 다른 블록들의 동작들과 데이터에 연결될 수 있으며, 이러한 경우 각 프로세스들 간에 통신 수단이 필요합니다.
이를 위해, 다른 프로세스들에 의한 데이터나 정보가 요구되어지고, 보내어진 메시지에 의해 프로세스들 사이에 교환되는 작업들이 쌓여 집니다. 이러한 접근법을 메시지 전달이라고 부릅니다. 메시지들은 광역적(모두 대 모두, 모두 대 개인, 개인 대 모두) 또는 지점들 간(하나의 전송 프로세스, 하나의 수신 프로세스)에 교환되어 지며, 전체 문제들의 결합 정도에 따라 많은 통신들이 필요해질 수 있습니다.
전체 구성원들 간에 전송되는 메시지의 수는 완전그래프(complete graph)로 설명될 수 있습니다. 사용된 계산 노드의 수는 이차적으로 증가합니다. |
계산 속도 향상 및 더 큰 문제 해결
컴퓨터 클러스터에서 작업하는 과학자는 다음 두 가지 방법으로 추가 자원으로부터 혜택을 얻을 수 있습니다.
첫째, 더 많은 메모리와 연산능력을 이용하여, 프로세스들을 추가하고, 프로세스 당 업무량을 유지하여, 더 큰 문제를 해결할 수 있습니다. 이러한 것으로 weak scaling라고 합니다.
혹은 전체 문제의 크기는 유지하고, 다수의 프로세스에 작은 작업들을 분배한다면, 각 프로세스들은 더 적은 작업량을 처리하므로, 더 빠르게 작업을 끝낼 수 있습니다. 이러한 접근법을 strong scaling이라고 합니다.
즉, 분산 메모리 연산은 같은 시간 동안 더 큰 문제를 해결하거나, 더 빨리 문제를 해결할 수 있습니다.
통신의 필요
메시지 전달에 대하여 살펴보도록 하겠습니다. 프로세스들은 어떻게 프로그램의 다른 부분들이 동작 중인지 알 수 있을까요? 위에서 언급한 바와 같이, 프로세스들은 자기가 혹은 다른 프로세서들이 필요한 정보나 변수들을 보내거나 받습니다. 이 동작은 네트워크를 통해 메시지들을 보내는데 걸리는 시간에 대하여 몇 가지 문제점이 발생하게 됩니다.
예를 들어, 각 각의 사무실의 테이블에 직원이 앉아서 그들 앞의 서류를 처리한다고 가정하겠습니다.
Alice라고 불리는 직원은 리포트 A를 변경하고, 그녀의 동료인 Bob에게 이러한 변경사항이 전달되기를 원합니다. 그녀는 하던 일을 멈추고, 그녀의 사무실에서 나와 Bob의 사무실로 걸어가서 새로운 정보를 전달하고, 다음 업무를 계속하기 위해 그녀의 책상으로 돌아옵니다. 이러한 동작은 회의실에서 정보를 주고 받는 것보다 더욱 복잡하며, 최악의 경우, 리포트를 수정하는 시간 보다 변경사항을 동료들에게 알리는데, 더 많은 시간이 소모될 수 있습니다.
그리고 작업의 진행을 늦추는 병목구간이 통신단계에 존재할 수 있습니다. 만약 우리가 통신할 량을 줄이거나, 속도를 높이기 위해 전화를 설치하거나, 다른 빠른 네트워크를 설치한다면, 메시지 전달에 필요한 시간을 절약할 수 있고, 더 많은 시간을 해석에 사용할 수 있습니다. 분산메모리 연산에서, 전선으로 연결된 노드들 사이에 전기적 데이터가 전달될 때, 병목구간이 발생하며, 높은 처리량과 지연시간을 줄이기 위하여, 인피니밴드(Infiniband)를 주로 사용하고 있습니다.
왜 분산 메모리를 사용해야 합니까?
분산 메모리 연산은 많은 장점을 가지고 있습니다. 그 중 하나는 공유메모리의 장점과 동일합니다. 클러스터에서 노드나 소켓, 코어들을 증가시켜 연산능력을 증가시키면, 점점 더 많은 프로세스와 추가 해석자원을 이용할 수 있습니다, 그래서 더 빠른 해석 결과를 얻기 위해, 더 많은 해석자원을 사용할 수 있습니다.
또 다른 장점은 분산 메모리 접근 방식을 이용하여, 클러스터에 추가된 모든 컴퓨터 노드의 사용 가능한 메모리를 활용할 수 있다는 점입니다. 우리는 더 이상 메인보드에 설치된 메모리 량에 제한 받지 않으며, 이론적으로는 임의의 큰 모델을 해석 할 수 있습니다. 대부분의 경우, 분산메모리 연산의 확장성은 공유 메모리 연산보다 크며, 스레드의 수 대비 속도향상 비는 프로세스의 수가 증가할수록 수렴됩니다.
아래의 구멍이 뚤린 소음기 모델을 이용한 프로세스 수에 대한 하루 동안 해석 횟수, 1 GB/s 이더넷이 통신 장비로 사용되었고, 처음 4개의 프로세스는 하나의 노드에서 실행되어, 이더넷 장비는 그 이후에 사용되었습니다. 4개 프로세스와 5개 프로세스의 하루당 해석 횟수의 차이가 작은 것은 느린 통신 장비 때문입니다. 사용된 컴퓨터 노드는 Intel® Xeon® E5-2609와 64GB DDR3 @1600 MHz를 가지고 있습니다. |
그러나, 우리는 한계 또한 알고 있어야 합니다. 공유 메모리 경우와 같이, 분산메모리 접근을 이용한 계산에서만 발생하는 몇 가지 문제가 있습니다. 따라서 병렬화 작업을 손쉽게 하는 것뿐만 아니라, 문제를 해결하는데 필요한 통신량까지 살펴볼 필요가 있습니다.
예를 들어, 대량의 입자가 매번 서로 영향을 주고 받을 경우, 모든 입자는 다른 모든 입자에 대한 정보를 가질 필요가 있습니다. 각각의 입자들이 각자의 프로세스로 계산되어 진다면, 통신량은 상단에 보여진 완전그래프에 의해 묘사되어 지며, 반복 작업당 메시지 개수는 프로세스와 입자의 개수 증가와 같이 급속도로 증가합니다. 하지만 파라미터 값들이 서로 독립적으로 계산되어지는 파라메트릭 해석은 거의 통신이 필요하지 않으므로, 통신 병목현상이 거의 발생하지 않습니다.
속도 향상을 테스트 하기 위한 모델. 이 모델은 PARDISO Direct 솔버를 이용한 작은 파라매트릭 모델(자유도:750,000)입니다. |
COMSOL에서 분산 메모리 사용의 장점
FNL(Floating Network License)를 가지고 있는 사용자는 다중 코어, 클러스터, 클라우드에 대한 COMSOL의 분산처리 기능을 사용 할 수 있습니다. 그리고 COMSOL 소프트웨어의 솔버 들은 분산모드에서 추가 설정 없이 사용됩니다. 그러므로 사용자는 동일시간 동안 좀 더 큰 해석을 수행하거나 더 빠른 해석을 수행 할 수 있습니다. 그러므로 COMSOL에서 분산처리 기능을 이용하시면, 사용자의 생산성을 향상시켜 줍니다.
분산처리 기능은 파라메트릭 해석 시 매우 유용합니다. 이 경우, 사용자는 COMSOL Multiphysics와 함께 실행되는 프로세스들에 자동으로 서로 다른 값들을 분배할 수 있습니다. 파라메트릭 해석 시, 각각의 작업들은 서로 독립적으로 계산되므로, “Embarrassingly parallel problem”으로 불리어 집니다. 속도 향상은 좋은 네트워크를 사용한다면 프로세스 수에 비례합니다.
분산 메모리 연산 설정에 대한 상세한 설명은 COMSOL Reference manual과 COMSOL Installation Guide를 참고하십시오.