• 검색 결과가 없습니다.

GLOVE Data Manager 데이터 구조의 재설계 및 구현

N/A
N/A
Protected

Academic year: 2021

Share "GLOVE Data Manager 데이터 구조의 재설계 및 구현"

Copied!
80
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)
(2)

저자소개

이세훈 (Sehoon Lee)

Korea Institute of Science and Technology Information Supercomputing Center

Senior Researcher

(3)

차 례

1. 개요 ··· 4

1.1. 대용량 과학데이터 가시화 ··· 4

1.2. GLOVE (GLobal Virtual reality visualization Environment for scientific simulation) ··· 4

1.3. GDM (GLOVE Data Manager) ··· 5

1.4. Global Array (GA) ··· 6

2. GDM 데이터 구조의 설계 ··· 8 2.1. GDM 데이터 구조 변경 요구사항 ··· 8 2.1.1. 선택적 로드(Selective Load) ··· 8 2.1.2. 다수의 사용자가 동일한 데이터를 로드하는 경우 ··· 8 2.1.3. 로드한 데이터 중에서 불필요한 부분을 언로드(Unload) ··· 9 2.1.4. ID와 Index에 대한 직관적인 인터페이스 제공 ··· 9 2.2. 설계 ··· 12 2.2.1. 선택적 로드(Selective Load) ··· 12 2.2.2. 자료 구조 ··· 16 2.2.3. 다중 사용자 공유를 위한 레퍼런스 카운트 적용 ··· 25 3. GA 수정사항 ··· 26 3.1. GA 객체 수 제한 ··· 26 3.2. GA 메모리 부족 체크 ··· 27 4. Fetch 기능 추가 ··· 29 4.1. FetchMeta ··· 29 4.2. Mesh 정보만 FetchNext ··· 29 4.3. Fetch(Vector Index) ··· 29

4.4. Scalar 묶어서 Vector로 Fetch ··· 30

5. 결론 ··· 31

(4)

4

-1. 개요

1.1. 대용량 과학데이터 가시화 지구과학, 기상, 천체물리, 항공우주공학 등의 분야에서 복잡한 과학 현상을 분석하 기 위해 사용되는 시뮬레이션 데이터의 분석 방법은 크게 그래프, 수치 데이터를 이 용한 정량적 분석과 데이터 가시화를 통한 정성적 분석의 두 가지로 나누어진다. 이 중 데이터 가시화를 이용한 정성적 분석을 통하면 전체 데이터의 양상과 흐름을 알 수 있고, 시뮬레이션이 올바른 방향으로 진행되고 있는지에 대한 즉각적인 판단도 가 능하다. 최근 컴퓨팅 자원의 급격한 성능 향상으로 시뮬레이션을 통해 더 정밀하고 규모가 큰 실험이 가능해 짐에 따라 시뮬레이션 결과 데이터의 양도 테라(Tera), 페타(Peta) 바이트 단위로 기하급수적으로 증가하는 추세이다. 이에 따라 과학 데이터 가시화 관 련 기술도 병렬 데이터 처리, 고해상도 렌더링, 복잡한 데이터를 알아보기 쉽게 보여 주기 위한 표현 방법 등을 지원하도록 발전해왔다.

1.2. GLOVE (GLobal Virtual reality visualization Environment for scientific simulation)

GLOVE[1]는 이러한 기술적 발전과 요구를 수용하기 위해 개발된 가시화 도구들 중 하나로, 고성능 컴퓨팅 환경에서 대용량 시뮬레이션 데이터를 효과적으로 분석하 고 가시화하여 공유한다. 고해상도의 Tiled Display와 VR(Virtual Reality)환경은 응 용 연구자에게 데이터 분석에 있어 직관적으로 다른 시각의 관점을 제공할 뿐만 아니 라 다 계층의 데이터 구조는 응용이 달라지더라도 최소한의 수정으로 응용에 맞는 하 나의 새로운 인터페이스를 제공한다.

그림 1은 GLOVE 시스템의 구조를 보여 준다. GLOVE는 사용자 인터페이스인 GIVI(GLOVE Integrated Visualization Interface)와 데이터 가공 및 렌더링을 담당 하는 GLORE(GLOVE Rendering Engine)의 두 부분으로 이루어진다. GIVI는 가상현 실 입출력 장치를 총괄하며, 사용자로부터 입력을 받아서 GLORE에 전달하고, GLORE의 실행 결과를 전달 받아서 화면에 출력한다. GLORE는 대용량 데이터의 가 공 및 렌더링을 위한 GIVI의 서브 시스템이다.

GLOVE에서 GLORE와 GIVI는 서로 독립적으로 운영되는 클러스터에서 실행된다. 이러한 구조는 GLOVE의 인터페이스(GIVI)와 핵심 렌더링 기능(GLORE)을 물리적으 로 분리할 수 있기 때문에 충분한 그래픽 처리능력을 갖추지 못한 시스템을 가지고 있는 사용자가 자신이 보유하고 있는 시스템에서 GIVI를 실행하고, 원격 장소의 고

(5)

5

-성능 렌더링 엔진인 GLORE를 이용해 대용량 데이터를 렌더링 할 수 있다.

1.3. GDM (GLOVE Data Manager)

대용량 데이터를 처리하는 가시화 도구는 성능이 가장 중요하다. GLOVE에서는 분 산 공유 메모리 데이터 관리자인 GDM이 대용량 데이터를 효율적으로 관리 및 처리하 는 역할을 맡고 있다.  GDM은 기본적으로 데이터에 대한 입출력을 병렬 처리함으로써 대용량 데이터에 대한 처리를 가능하게 한다. 일반적으로 사용자들은 최대한 많은 데이터를 메모리에 올려 작업을 수행하고 싶어 하지만 노드 하나의 메모리는 한정되어 있기 때문에 대용 량 데이터의 경우 오랜 로딩 및 처리 시간을 참을 수밖에 없다. 특히나 가시화에 있 어 많은 시간이 소요되는 부분이 데이터 로딩이다. GDM을 활용한 GLOVE는 한 노드 에서는 처리 불가능한 1.21TB의 데이터를 158.4초에 로딩한다[1]. GDM은 대용량 데이터 처리를 위한 부하 분산 기능을 수행한다. 대용량 데이터는 일반적으로 하나의 노드에서 처리가 힘들기 때문에 데이터를 여러 노드에 미리 나누 고 병렬처리 하는 Static Data Decomposition 방식을 활용한다. 하지만 컴퓨팅 자 원이 부족해도 데이터가 없는 노드에는 작업을 분배할 수 없는 Static Data Decomposition 방식의 한계를 극복하기 위해 GDM은 분산 공유 메모리의 하나인 GA(Global Array)[2]의 기능을 이용해 데이터 존재 유무에 관계없이 모든 노드에 작 업을 분배함으로써 공정한 부하 분산 효과를 얻는다.  GDM에 데이터를 로딩하면 각 노드에 이를 분산한다. 가시화 요청을 받은 스케줄러 는 데이터의 위치에 관계없이 모든 노드에 작업을 분배하고, 각 노드에 분산된 가시화

(6)

6

-엔진들이 각 노드에 병렬 처리 작업을 스케줄링하여 요청하면 각 노드에 있는 GDM이 데이터가 자신의 노드에 있지 않더라도 GA 영역에서 찾아 로컬 메모리에 복사한다.  이를 통해 데이터의 위치에 관계없이 공정한 부하 분산이 가능하게 된다. 그림 2는 스케쥴러가 작업을 분배할 때 GDM이 이를 어떻게 처리하는지 보여준다.

1.4. Global Array (GA)

분산 공유 메모리를 활용하여 분산 병렬 처리를 수행하는 가시화 도구들은 주로 분 산 공유 메모리를 I/O 시간을 줄이기 위해 캐쉬(cache)로 활용한다. 기존의 연구가 디스크가 아닌 로컬 메모리를 사용하는 것과 같은 효과를 얻기 위해 대용량 데이터의 캐쉬에 대한 hit ratio를 높이는데 기여하였다면 GDM은 분산 공유 메모리의 하나인 Global Array[2]의 기능을 활용하여 분산 병렬 처리의 공정한 부하 분산으로 Load balancing의 효과도 함께 얻고자 한다.

Global Array는 분산 메모리를 가진 클러스터 환경에서 효율적이고 이식 가능한 Shared memory 프로그래밍 인터페이스를 제공한다. MIMD 병렬 컴퓨팅 환경을 위 한 프로그래밍 모델에는 크게 Distributed memory와 Shared memory의 두 가지로 나누어진다. 두 프로그래밍 모델은 모두 장단점을 가진다. Shared memory 모델은 사용하기 쉽지만, data의 locality와 placement를 무시한다. 다시 말해, 전체를 하나 의 공유 메모리처럼 사용하므로 어떤 데이터를 shared memory 영역에 놓았을 때, 그것이 local memory인지 remote memory인지 프로그래머에겐 transparent하다. 현대의 컴퓨팅 환경에서 이러한 특징은 확장성과 효율에 있어 단점으로 작용한다. 이

(7)

7

-러한 문제를 해결하기 위해 shared data에 대해 데이터를 재사용하도록 코드를 수정 하거나 매우 큰 단위로 블록을 로드하고 저장하여 성능을 향상 시켜야 한다[3]. Distributed memory 모델은 메시지 교환이나 one-sided communication으로 성 능과 확장성을 보장하지만, 사용하기 어려운 단점이 있다. Global Array는 양쪽 모델 의 매력적인 장점만을 수용한다. Global Array는 프로그래머가 locality를 관리할 수 있는 Shared memory 모델이다.

(8)

8

-2. GDM 데이터 구조의 설계

2.1. GDM 데이터 구조 변경 요구사항 2.1.1. 선택적 로드(Selective Load) GLOVE는 테라 바이트 단위의 대용량 데이터를 대상으로 한다. 대용량 과학 데이 터는 일반적으로 1) 데이터를 구성하는 물리적인 단위인 Element와 2) 속도, 압력과 같은 데이터 Field를 나타내는 Value, 그리고 3) 병렬처리를 고려해 나누어진 Block 으로 구성되면, 시변환(Time-varying) 데이터의 경우에는 4) Timestep에 따라 나누 어진다.

대용량 데이터는 전체를 로드하는데 많은 시간이 소요되기 때문에 일부 데이터(특 정 Element, Value, Timestep)만을 관찰하고 싶은 경우 전체 데이터를 로드하는 것 은 비효율적이다. 전체 데이터 중에서 필요한 Element 또는 Value를 선택하거나, 전 체 Timestep 중에 필요한 부분만 선택해서 로드할 수 있다면 더욱 효과적으로 프로 세스를 진행할 수 있다. 2.1.2. 다수의 사용자가 동일한 데이터를 로드하는 경우 기존 방식에서는 한 사용자가 데이터 전체를 로드하고, 다른 사용자가 동일한 데이 터를 로드하고자 하면 이미 로드된 데이터를 공유하는 방식을 사용한다. 그러나 선택 적 로드(Selective Load)가 가능해지면서 동일한 데이터에 대한 각각의 로드가 서로 일치하지 않는 부분이 발생하게 된다. 예를 들어, 사용자 A, B가 Element 0, 1, 2로 구성된 데이터를 로드할 때, A는 Element 0과 1을, B는 Element1과 2를 로드하는 경우가 이에 해당한다. 각각을 다른 데이터로 처리하고 중복해서 로드할 수도 있으나 메모리를 낭비하게 된다. 한정된 메모리를 효과적으로 사용하기 위해서는 중복적인 로드는 지양하는 것이 좋다. 기존 데이터와의 합집합을 생성하여 이미 로드된 부분은 공유하고, 새로운 부분만 로드하는 방식을 활용하면 된다.

(9)

9 -<values>

<value>

<id> 0 </id> → ① meta.xml의 ID <name> Pressure </name>

</value> <value>

<id> 1 </id>

<name> Velocity </name> </value>

<value>

<id> 2 </id>

<name> Q-criteria </name> </value>

<value>

<id> 3 </id>

<name> Density </name> </value> </values> <elements> <element> <id> 0 </id> <value> <size> 3 </size> <ids> 2,1,3 </ids> → 저장순서 </value> </element> <element> <id> 1 </id> <value> <size> 4 </size> <ids> 0,3,1,2 </ids> </value> </element> </elements> 2.1.3. 로드한 데이터 중에서 불필요한 부분을 언로드(Unload) 기존 GLOVE는 데이터 전체를 로드하거나 언로드하는 기능만을 제공한다. 따라서 전체를 로드하는데 많은 시간이 소요되는 대용량 데이터의 경우에는 실수로 불필요한 부분을 포함하여 올리거나, 또는 사용 중에 더 이상 필요 없어진 부분이 생기더라도 이를 그대로 둘 수밖에 없었다. 전체 데이터 중 불필요한 부분들을 선택하여 언로드 할 수 있다면 이로 인해 새로 생기는 메모리 영역을 다른 데이터를 로드하는데 활용 할 수 있다. 2.1.4. ID와 Index에 대한 직관적인 인터페이스 제공

기존 GLOVE에서는 데이터를 구성하고 있는 Element, Value, Timestep을 표기하 는 방식이 다음과 같은 3가지 방법으로 혼용되고 있다.

① meta.xml의 ID

② GDM 디렉토리에서의 Index ③ GA(Global Array)에서의 Index

meta.xml 파일은 GLOVE가 처리하려는 데이터 셋의 메타데이터 정보를 담고 있는 파일이다. 전체 Value의 목록과 각 Element가 실제 GDM 디렉토리에서 어떤 순서로 Value를 저장하고 있는지 정보가 기술되어 있다. 그림 4의 meta.xml의 예제를 참고 하면 실제 GDM 디렉토리에서는 0번 Element는 Value 2, Value 1, Value 3의 순 서로, 1번 Element는 Value 0, Value 3, Value 1, Value 2의 순서로 데이터를 저 장하고 있음을 알 수 있다.

(10)

10

기존 GLOVE에서는 사용자가 인터페이스를 통해 특정 Element나 Value를 지정하 기 위해서는 『② GDM 디렉토리에서의 Index』를 사용한다. 만약 1번 Element의 Density 값을 지정하기 위해서는 Density의 Value ID인 3이 아닌 Element의 Value 저장순서 정보인 1(3은 두 번째, 0부터 시작)을 사용해야 한다. 이는 사용자에게 매번 meta.xml의 저장순서 정보를 확인해야 하는 번거로움을 감수하게 하고, 때로는 사용 자의 실수를 유발한다. (그림 5 참조)

전체 데이터를 로드하는 것만이 가능하던 기존 방식에서는 『② GDM 디렉토리에서 의 Index』와 『③ GA에서의 Index③』은 항상 같은 값을 가질 수밖에 없었으나 일부 데이터를 선택하는 선택적 로드가 가능해지면서 서로 다른 값을 가질 수 있게 된다. (<그림 6> 참조) 사용자가 Element 1에서 Value 1과 Value 3을 선택해서 로드하면 실제 GDM 내부의 GA에서는 0번째, 1번째에 데이터가 저장된다.

(11)

11

사용자에게 가장 직관적인 방법은 모든 경우에 『① meta.xml의 ID』를 사용하는 것 이다. Element의 순서 정보를 모르더라도 Value 3(Density)을 지정하면 GLOVE가 자동으로 변환하여 사용자가 원하는 데이터에 접근할 수 있어야 한다. 기존 GLOVE 의 코드 곳곳에 Index와 ID가 혼용되고 있어, 개발 과정에서도 실수를 유발하고 있어 모든 인터페이스에서 직관적인 방식인 ID를 일관적으로 사용하도록 개선하는 것이 반 드시 필요하다.

(12)

12 -2.2. 설계 2.2에서는 2.1의 GDM 구조 변경에 대한 요구사항을 바탕으로 선택적 로드 기능과 GDM의 데이터 구조를 새롭게 설계한다. 2.2.1. 선택적 로드(Selective Load) GDM은 선택적 로드 기능을 통해 전체 데이터에서 원하는 Element, Value, Timestep을 지정해 로드할 수 있다. 선택적 로드 방법에는 다음과 같은 3가지가 있 다. 가. Element 및 Value 선택 먼저 Element와 그에 포함되는 Value를 선택하는 방식이다. 기본적으로 옵트 아웃 (Opt-out) 방식을 적용한다. 옵트 아웃은 사용자가 특별히 언급하지 않은 부분은 디 폴트로 로드하는 방식이다. 특정 Element에서 일부 Value만을 로드하기 위해 선택하 거나, 특정 Element 전체를 로드하지 않는다는 의사를 나타내지 않으면, 그 Element 전체를 로드하는 방식이다.

다음 예제는 Element 0에서 Value 0, Value 1을 선택하고, Element 1에서 Value 1과 Value 2를 선택하는 경우이다. 이와 같이 설정하면 Element 0과 Element 1은 선택한 Value만을 로드하고, 다른 Element가 있다면 Value 전체를 로 드한다.

int elemInfoSize = 2;

LOAD_ELEMENT *elemInfo = new LOAD_ELEMENT[elemInfoSize]; elemInfo[0].mElementId = 0; elemInfo[0].mValueCount = 2; elemInfo[0].mValueList[0] = 0; elemInfo[0].mValueList[1] = 1; elemInfo[1].mElementId = 1; elemInfo[1].mValueCount = 2; elemInfo[1].mValueList[0] = 1; elemInfo[1].mValueList[1] = 2; rtnLoad = manager->Load("/xtmp/01DataSet/Sample/meta.xml", elemInfoSize, elemInfo);

(13)

13

만약 Element 0은 위와 동일하게 Value 0, Value 1을 선택하고, Element 1은 전 체 Value를 모두 로드하고 싶다면 다음과 같이 Element 1에 대한 정보는 따로 기술 하지 않으면 된다.

int elemInfoSize = 1;

LOAD_ELEMENT *elemInfo = new LOAD_ELEMENT[elemInfoSize]; elemInfo[0].mElementId = 0; elemInfo[0].mValueCount = 2; elemInfo[0].mValueList[0] = 0; elemInfo[0].mValueList[1] = 1; rtnLoad = manager->Load("/xtmp/01DataSet/Sample/meta.xml", elemInfoSize, elemInfo); 특정 Element 전체를 로드하고 싶지 않은 경우에는 해당 Element의 mValueCount를 0으로 설정하면 된다. 다음은 Element 0의 Value 0, Value 1을 선택하고, Element 1은 로드하지 않는 경우이다.

int elemInfoSize = 2;

LOAD_ELEMENT *elemInfo = new LOAD_ELEMENT[elemInfoSize]; elemInfo[0].mElementId = 0; elemInfo[0].mValueCount = 2; elemInfo[0].mValueList[0] = 0; elemInfo[0].mValueList[1] = 1; elemInfo[1].mElementId = 1; elemInfo[1].mValueCount = 0; rtnLoad = manager->Load("/xtmp/01DataSet/Sample/meta.xml", elemInfoSize, elemInfo); 나. Value 리스트 선택

Element별로 원하는 Value를 설정하지 않고, 로드하고 싶은 Value 리스트 전체를 지정해서 로드하는 방법도 있다. Value 리스트를 지정하면 각 Element의 Value 중 에서 리스트에 포함되어 있는 Value만 골라서 로드해준다. 해당되는 Value가 없는

Element는 로드하지 않는다. elemInfoSize의 값을

(14)

14

-int elemInfoSize = GDM_SELECT_LOAD_VALUE_LIST; LOAD_ELEMENT *elemInfo = new LOAD_ELEMENT; elemInfo->mValueCount = 3; elemInfo->.mValueList[0] = 0; elemInfo->.mValueList[1] = 1; elemInfo->.mValueList[2] = 2; rtnLoad = manager->Load("/xtmp/01DataSet/Sample/meta.xml", elemInfoSize, elemInfo); 다. Timestep 선택

Timestep을 선택하는 방법에는 1) start, end, inc 방식과 2) 리스트 방식의 2가 지가 있다.

1) start, end, inc 방식

먼저 첫 Timestep(Start), 마지막 Timestep(End), 증가분(Inc)을 통해 지정하는 방 식이다. 다음 예제와 같이 Start = 0, End = 10, Inc = 2를 지정하면 (0, 2, 4, 6, 8, 10)의 6개의 Timestep을 선택하여 로드한다.

TIMESTEP* timestep = new TIMESTEP; timestep->mStart = 0;

timestep->mEnd = 10; timestep->mInc = 2;

rtnLoad = manager->Load("/xtmp/01DataSet/Sample/meta.xml", timestep); 2) 리스트 방식

두 번째 방식은 원하는 Timestep을 직접 리스트로 만들어 지정하는 방식이다. 다 음 예제와 같이 지정하면 위의 예제와 동일한 데이터를 로드한 결과를 얻게 된다.

int tsSize = 6;

int tsList[tsSize] = { 0, 2, 4, 6, 8, 10 };

rtnLoad = manager->Load("/xtmp/01DataSet/Sample/meta.xml", tsSize, tsList);

(15)

15

-① 데이터 전체를 로드

GDM_LOAD_DATA* Load(char *filename) ② Timestep만 선택(start, end, inc 방식)

GDM_LOAD_DATA* Load(char *filename, TIMESTEP* timestep); ③ Timestep만 선택(리스트 방식)

GDM_LOAD_DATA* Load(char *filename, int tsSize, int* timestep); ④ Element-Value만 선택

GDM_LOAD_DATA* Load(char *filename,

int elemInfoSize, LOAD_ELEMENT* eleminfo); ⑤ Timestep(start, end, inc 방식)과 Element-Value 모두 선택

GDM_LOAD_DATA* Load(char *filename, TIMESTEP* timestep,

int elemInfoSize, LOAD_ELEMENT* eleminfo); ⑥ Timestep(리스트 방식)과 Element-Value 모두 선택

GDM_LOAD_DATA* Load(char *filename, int tsSize, int* tsArray, int elemInfoSize, LOAD_ELEMENT* eleminfo); 라. GDM 제공 인터페이스

기존의 데이터 전체를 로드하는 경우에 가, 나, 다의 경우를 추가해 GDM은 다음의 6가지 인터페이스를 통해 원하는 Element, Value, Timestep을 선택하는 기능을 제 공한다.

(16)

16 -2.2.2. 자료 구조 기본적으로 GA는 데이터를 배열(Array) 방식으로 저장하기 때문에 데이터를 로드 하기 전에 미리 메모리를 할당한다. 이와 같은 방식은 전체 데이터를 로드하는 것을 전제로 설계되어 로드 후에 동적으로 데이터를 추가/삭제하기에 어려움이 있다. GDM에서 실제 데이터를 관리하거나 또는 데이터에 대한 메타 정보를 관리하는 클 래스에는 gdmDatapool, gdmElement, gdmData, gdmMetadata, gdmBBoxMeta, gdmMinMaxMeta가 있다. 새로 설계된 구조를 살펴보기 전에 기존 GDM의 자료 구 조에 대해 먼저 살펴본다. Ÿ gdmDatapool gdmDatapool 클래스는 하나의 데이터 셋에 대한 모든 정보를 유지하고 관리한 다. 로드를 요청하여 하나의 데이터 셋을 GA 영역에 저장하고자 할 때 하나의 gdmDatapool 클래스 인스턴스가 생성된다. gdmDatapool 인스턴스는 그 데이터 셋에 대한 메타 정보를 gdmBBoxMeta와 gdmMinMaxMeta 클래스를 멤버로 유지 하고 관리한다. 또한 원 데이터를 gdmElement 클래스와 gdmData 클래스의 계 층 구조를 리스트로 유지하고 관리한다.

(17)

17

-Ÿ gdmElement / gdmData

gdmElement 클래스는 gdmData 클래스의 리스트를 관리한다. gdmData 클래스 는 value별로 하나의 인스턴스를 생성하여 리스트에 추가한다. value는 원 데이터 중 속성이 다른 값들을 하나의 value로 분류한다. GLOVE의 응용 중 하나인 로터 시뮬레이션 데이터의 경우, value로 분류되는 것은 pressure, velocity 등이 있 다. 그러나 이러한 응용에서의 의미는 GDM에서 사용되지 않는다. 이들은 gdmElement가 관리하는 하나의 인덱스로 구분된다. GA 영역의 생성은 value 단 위인 gdmData 단위로 이루어진다. Ÿ gdmMetadata gdmMetadata 클래스는 데이터 셋에 대한 메타 정보를 유지하고 관리한다. 응용 마다 데이터의 형태와 요소는 다르다. 그러나 GDM은 이러한 데이터의 형식에 관 계없이 표준화된 배열 형태의 데이터로 다룬다. 따라서 GDM은 데이터를 로드할 때 응용이 데이터에 부여한 의미를 인덱스 형태로 표현하는 메타 정보 파일을 함 께 읽는다. 이 메타 정보 파일은 응용과 GDM이 공유하는 파일로 데이터의 형태와 의미를 표현하는 하나의 표준화된 형식을 가진다. gdmMetadata가 파일을 읽어 파싱된 정보를 제공한다.

(18)

18

-Ÿ gdmBBoxMeta

gdmBBoxMeta 클래스는 데이터 셋의 mesh 데이터에 대한 메타 정보를 GA 영역 에 유지하고 관리한다. Element, Timestep, Block별로 bounding box 정보를 유 지한다. Timestep 전체와 Block 전체에 대한 bounding box도 별도로 유지한다.

Ÿ gdmMinMaxMeta

gdmMinMaxMeta 클래스는 데이터 셋의 value 데이터에 대한 메타 정보를 GA 영역에 유지하고 관리한다. Element, Value, Timestep, Block별로 최대/최소값 정보를 유지한다. Timestep 전체와 Block 전체에 대한 최대/최소값 정보도 별도 로 유지한다.

(19)

19

그림 12는 기존 GDM에서 하나의 데이터 셋이 로드되어 저장되는 방식을 보여준 다. 데이터 셋을 저장하기 위해 gdmDatapool, gdmMetadata, gdmBBoxMeta, gdmMinMaxMeta 클래스 인스턴스들이 각각 하나씩 사용된다. 그림에서 색칠된 부분 은 선택적 로드를 통해 전체 데이터 중에서 로드를 위해 선택된 부분을 나타낸다. 로 드하기 전에 meta.xml 정보를 바탕으로 배열로 전체 메모리를 할당하기 때문에 선택 적 로드를 적용하게 되면 할당해놓은 전체 메모리를 모두 활용하지 못하는 것을 확인 할 수 있다.

(20)

20

앞서 살펴 본 기존 GDM 데이터 구조의 문제점을 해결하고 새로운 요구사항을 반 영하기 위해 데이터 셋을 로드한 후에도 원하면 언제든지 데이터를 추가 및 삭제할 수 있도록 모든 데이터 구조(GA 및 GDM 객체)가 Element, Value, Timestep에 독 립적이도록 수정한다.

(21)

21

-Ÿ gdmDatapool

gdmDatapool은 하나의 데이터 셋과 1:1로 대응되며, 물리적인 데이터가 실제로 저장된다. 다수의 사용자가 동일한 데이터 셋에 대해 각자 다른 부분을 선택하여 로드하더라도 기존 데이터와의 합집합을 생성하여, 새로운 부분만 추가된다. 이를 위해 Element, Value, Timestep을 모두 Map으로 관리하여 동적으로 추가/삭제 가 가능하도록 변경된다. GA 객체는 Block 단위로 최소화된 Array로 생성된다.

(22)

22

-Ÿ gdmMetadata

gdmMetadata는 gdmDatapool이 유지하는 데이터의 합집합 중에서 하나의 사용 자가 로드한 부분이 어느 부분인지에 대한 정보를 유지한다. 즉, 각 사용자의 로드 요청 하나가 gdmMetadata 하나에 대응되는 것이다. gdmDatapool은 다수의 gdmMetadata를 리스트로 관리하고, 각각의 로드에 대해 별도의 metadata id가 부여한다.

(23)

23

-Ÿ gdmMinMaxMeta

gdmMinMaxMeta도 역시 Element, Value, Timestep을 모두 Map으로 관리하여 동적으로 추가/삭제가 가능하도록 변경된다. GA 객체는 Block 단위로 최소화된 Array로 생성된다. 전체 Timestep에 대한 Value별 최대/최소값은 사용자가 선택 한 로드에 따라 달라질 수 있기 때문에 기존과 다르게 metadata id별로 별도로 유지되어야 한다.

(24)

24

-Ÿ gdmBBoxMeta

gdmBBoxMeta도 Element, Timestep을 모두 Map으로 관리하여 동적으로 추가/ 삭제가 가능하도록 변경된다. GA 객체는 Block 단위로 최소화된 Array로 생성된 다. 전체 Timestep에 대한 Bounding box 정보는 사용자가 선택한 로드에 따라 달라질 수 있기 때문에 기존과 다르게 metadata id별로 별도로 유지된다. 그리고 시간에 따라 mesh 정보가 변하지 않는 Static mesh의 경우에는 Timestep별로 따로 정보를 유지할 필요가 없기 때문에 그림 17의 오른쪽 그림의 Element 1과 같이 하나로만 유지된다.

(25)

25

-2.2.3. 다중 사용자 공유를 위한 레퍼런스 카운트 적용

gdmDatapool, gdmMinMaxMeta, gdmBBoxMeta는 다수의 사용자의 로드한 데이 터에 대한 정보를 유지하고 관리하고 있다. 데이터가 중복되지 않도록 합집합을 유지 하고, 데이터 언로드를 통해 삭제 요청이 오더라도 다른 사용자가 사용하고 있는 데 이터는 그대로 유지하고 필요 없어진 부분만 삭제할 수 있어야 한다. 이를 위해 gdmDatapool, gdmMinMaxMeta, gdmBBoxMeta에 레퍼런스 카운트를 적용한다. 그림 18의 괄호 안의 숫자는 해당 데이터를 사용하고 있는 사용자의 수를 의미한다. 새로 로드가 요청이 될 때마다 카운트를 증가시키고, 언로드가 요청되면 카운트를 감 소시킨다. 레퍼런스 카운트가 0이 되면 그 부분은 메모리에서 완전히 삭제된다.

(26)

26

-클래스 기존 신규

gdmMinMaxMeta #E O(#E * #T * #V)

gdmBBoxMeta #E O(#E * #V)

gdmDatapool O(#E * #V) O(#E * #T * #V)

#E = (Element 개수) #T = (Timestep 개수) #V = (Value 개수)

/**

* Return a new global array handle */

#if HAVE_SYS_WEAK_ALIAS_PRAGMA

# pragma weak wnga_create_handle = pnga_create_handle #endif

Integer pnga_create_handle() {

Integer ga_handle, i, g_a;

/*** Get next free global array handle ***/ GA_PUSH_NAME("ga_create_handle");

ga_handle =-1; i=0;

3. GA 수정사항

3.1. GA 객체 수 제한

2장에서 살펴본 바와 같이 GDM의 데이터 구조를 Element, Timestep, Value에 독립적으로 변경하면서 하나의 데이터 셋을 저장하기 위한 GA 객체 수는 증가하게 되었다. (표 2 참조)

정렬격자(Structured grid) 데이터와 다르게 비정렬격자(Unstructured grid) 데이 터는 많은 수의 Element로 이루어진 경우가 많아 GA 객체 수가 1000개를 넘는 경 우가 빈번하다. 비정렬격자 데이터를 다루던 중 GA 객체 수가 1000개를 넘으면 GA 영역의 생성이 실패하는 문제가 발생했다. GA 코드 중 global/src/base.c 파일의 pnga_create_handle() 함수에서 그 원인을 발견했다. GA는 객체를 생성할 때 g_a = ga_handle – GA_OFFSET과 같은 방식으로 번호를 매기는데 GA_OFFSET의 값 이 1000으로 되어 있어 ga_handle이 증가해서 g_a가 0이 되면 그 반환값을 에러로

인식하면서 발생하는 문제이다. 이를 위해 global/src/globalp.h와

(27)

27 do{

if(!GA[i].actv_handle) ga_handle=i; i++;

}while(i<_max_global_array && ga_handle==-1); if( ga_handle == -1)

pnga_error(" too many arrays ", (Integer)_max_global_array); g_a = (Integer)ga_handle – GA_OFFSET; → ga 객체 번호 계산 /*** fill in Global Info Record for g_a ***/

ga_init_struct(ga_handle);

GA[ga_handle].p_handle = GA_Init_Proc_Group; GA[ga_handle].ndim = -1;

GA[ga_handle].name[0] = '\0';

int

main (int argc, char *argv[]) {

...(생략)...

// Initialize Global Arrays GA_Initialize();

GA_Set_memory_limit(GA_MAX_MEMORY); → 노드별 메모리 한도 설정 int status = MA_init(C_DBL, stack, heap);

if ( AnyFailure( status == 0 ) ) {

LOG4CXX_ERROR(cLogger, str(boost::format("[%d] failed to init GA") % rank));

if (rank == 0) WriteProcessStatus("dmCore", GLV_FAIL); GA_Terminate(); MPI_Finalize(); exit(0); } 3.2. GA 메모리 부족 체크 대용량 데이터를 로드하기 전에 GA 영역에 충분한 공간이 남아있는지를 확인하는 과정이 필요하다. gdmCore.cc의 main()에서 GA_Set_memory_limit()을 통해 먼저 노드별 한도를 설정한다. 기존 GA 코드의 타입 문제로 최대 1GB 밖에 설정되지 않는 문제가 있었으나 global/src/base.c 내부의 단위를 Byte에서 KB로 변경해서 해결했 다.

(28)

28 -void

gdmCoreManager::UpdateGAMemoryAmount() {

// 메모리 체크 (모든 노드에 동일하게 분포된다고 가정)

unsigned int mem_avail = GA_Memory_avail()/1024; // MB mAvailableMem = mem_avail * mNumberOfNodes;

unsigned int mem_used = GA_Inquire_memory()/1024/1024; // MB mUsedMem = mem_used * mNumberOfNodes;

if (mRank == 0) LOG4CXX_INFO(cLogger, str(boost::format("Total memory(MB): used=%d available=%d(mem_avail=%d * #nodes=%d)") % mUsedMem % mAvailableMem % mem_avail % mNumberOfNodes));

} int

gdmCoreManager::ProcessLoad() {

...(생략)...

size_t ga_size = dp->GetEstimatedGASize()/1024/1024; // MB

UpdateGAMemoryAmount();

if (GetAvailableGAMemory() < ga_size) {

LOG4CXX_ERROR(cLogger, str(boost::format("Not enough memory: ga=%d available=%d") % ga_size % GetAvailableGAMemory()));

ret = -GANotEnoughMemory;

if (mRank == 0) LOG4CXX_ERROR(cLogger, str(boost::format("Not enough memory")));

mDataTable->RemoveData(mid);

if (mRank == 0) SendAck(GDM_RTN_FAIL, ret); return ret;

}

데이터를 로드하기 전에 필요한 GA 영역의 크기를 계산하고

(gdmDatapool.GetEstimatedGASize()), 이를 현재 사용가능한 영역의 크기 (gdmCoreManager.GetAvailableGAMemory())와 비교하여 부족하면 에러 처리한다.

(29)

29

-4. Fetch 기능 추가

4.1. FetchMeta

GDM_FETCH_DATA_LIST* FetchMeta(int mid)

로드된 데이터에 대한 메타 정보를 반환한다. 제공하는 정보는 다음과 같다.

Ÿ 전체 Value 정보 : 데이터 셋 전체의 Value 정보 (Value 이름, id, index 등)

Ÿ Timestep 정보 : Timestep index와 실제 Timestep id와의 매핑 정보

Ÿ Element 정보 (id, mesh type, block 개수, value 개수, value index-id 매핑

정보)

Ÿ 데이터 셋 전체(모든 Timestep + 모든 Block)에 대한 각 Value의 최대/최소값

Ÿ Element-Timestep별 각 Value의 최대/최소값

Ÿ Element-Timestep-Block별 Bouning box 정보

4.2. Mesh 정보만 FetchNext

GDM_FETCH_DATA_LIST*

FetchNext(int ticket, int session, int ts, int element)

기존의 FetchNext는 최소 하나 이상의 Value를 포함해야 했으나 mesh 정보만 필요 한 경우를 위해 추가되었다. 각 value가 중복으로 가지고 있던 FetchNext 정보들을 mesh에서만 관리하도록 수정되었다. Ÿ InitLocalityInfo() Ÿ FetchNextInitialize() Ÿ GetNextFetchBlockId() 4.3. Fetch(Vector Index) GDM_FETCH_DATA_LIST*

FetchNext(int data, int session, int ts, int* fieldList, int fieldCount, int element, int* vidxList);

GDM_FETCH_DATA_LIST*

Fetch(int ticket, int ts, int field, int element, int block, int vindex) GDM_FETCH_DATA_LIST*

Fetch(int ticket, int ts, int* fieldList, int fieldCount, int element, int block, int* vidxList)

벡터 데이터 중에 특정 인덱스(x, y, z)만을 원하는 경우에 필요한 기능이다. 지정한 인덱스만을 추출하여 스칼라 데이터 형태로 반환한다.

(30)

30

-4.4. Scalar 묶어서 Vector로 Fetch

GDM_FETCH_DATA_LIST*

FetchNextVector(int data, int session, int ts, int* fieldList, int fieldCount, int element);

GDM_FETCH_DATA_LIST*

FetchVector(int data, int ts, int* fieldList, int fieldCount, int element, int block);

벡터 데이터의 각 필드가 별도의 Value로 저장되어 있는 경우에 필요한 기능이다. 지 정한 Value 리스트를 하나의 벡터로 묶어 반환한다. 지정한 Value는 반드시 스칼라 데이터이어야 한다.

(31)

31

-5. 결론

지금까지 고성능 컴퓨터 환경에서 대용량 시뮬레이션 데이터를 실시간으로 병렬 가 시화하기 위한 도구 GLOVE의 분산 공유 메모리 관리 시스템인 GDM의 개선 사항에 대해 살펴보았다. 대용량 데이터는 전체를 로드하는데 많은 시간이 소요되기 때문에 일부 데이터(특 정 Element, Value, Timestep)만을 관찰하고 싶은 경우 전체 데이터를 로드하는 것 은 비효율적이다. 전체 데이터 중에서 필요한 Element 또는 Value를 선택하거나, 전 체 Timestep 중에 필요한 부분만 선택해서 로드할 수 있다면 더욱 효과적으로 프로 세스를 진행할 수 있기 때문에 선택적 로드(Selective Load)를 적용해 원하는 일부 데이터만을 선택해서 로드할 수 있게 했다. 다수의 사용자가 동일한 데이터를 로드하는 경우가 많아지면서 한정된 메모리를 효 과적으로 사용하고 중복적인 로드를 지양하기 위해 기존 데이터와의 합집합을 생성하 여 이미 로드된 부분은 공유하고 새로운 부분만 로드하는 방식을 활용할 수 있도록 하고, 로드한 데이터 중에서 불필요한 부분을 언로드할 수 있을 뿐 아니라 Element, Value, Timestep을 표기하는 id와 index를 직관적으로 구분할 수 있도록 GDM 데이 터 구조를 Map 기반으로 Element, Value, Timestep에 독립적으로 수정했다.

데이터 구조 변경으로 인한 GA 객체 수 증가로 발생한 GA 문제를 수정하고, GA에 서 현재 사용 중인 메모리의 크기를 확인하여 메모리가 부족한 경우 미리 에러 처리 를 할 수 있도록 하는 기능을 추가했다. 향후에는 GA 객체 수 증가로 인한 성능 저하 가능성을 검토해보고자 한다. 그리고 중복적으로 처리되고 있는 부분들에 대한 데이터 구조 및 코드에 대한 리팩토링을 더 진행하여 더 효율적으로 대용량 데이터를 처리할 수 있는 GDM을 만들어갈 예정이다.

(32)

32

-6. 참고문헌

[1] Min-Ah Kim et al, "GLOVE(GLObal Virtual reality visualization Environment for scientific simulation): VR환경에서의 대용량 데이터 가시화 시스템" 2010 한국컴퓨터종합학술대회 논문집 제37권 제2호(B), 267-271

[2] Jarek Nieplocha , Bruce Palmer , Vinod Tipparaju , Manojkumar Krishnan , Harold Trease , Edoardo Aprà, “Advances, Applications and Performance of the Global Arrays Shared Memory Programming Toolkit”, International Journal of High Performance Computing Applications, vol.20 No. 2, pp.203-231, May 2006

[3] Laurent C., Chrisophere M, Xavier C. and Bruno Levy, "Distributed Shared Memory for Roaming Large Volumes", IEEE Transactions on Visualization and Computer Graphics, vol. 12, No.5, Sept/Oct 2006

(33)
(34)
(35)
(36)
(37)
(38)
(39)
(40)
(41)
(42)
(43)
(44)
(45)

< >

g d m B B o x M e t a

g d m G A M e t a

g d m B B o x M e t a

g d m G A M e t a

∼ ∗ ∗ ∗ ∗

(46)

∗ ∗ ∗ ∗ ∗ ∗ ∗ < < > > < < > > ∗

(47)

(48)

∗ ∗

(49)
(50)

< > gdmCoreManager gdmLoader mLoader gdmCoreQueue m Q u e u e ∗ ∗ ∗

(51)

< >

(52)

< >

g d m D a t a

g d m M e s h

gdmValue

< >

(53)
(54)

< > gdmDatapool gdmMinMaxMeta m M i n M a x M e t a g d m G A M e t a g d m B B o x M e t a m B B o x M e t a ∼ ∗ ∗

(55)

∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ < ∗ >

(56)

< ∗ >

(57)
(58)
(59)

(60)

(61)
(62)

∗ ∗

∗ ∗

(63)
(64)

< >

gdmElement

g d m M e s h

m M e s h

g d m D a t a

(65)

< > g d m G A M e t a g d m B B o x M e t a gdmMinMaxMeta ∼ ∗ ∗ ∗ ∗

(66)

(67)
(68)

< >

(69)

< >

g d m M e s h

g d m D a t a

g d m M e s h

g d m D a t a

< > ∗ < ∗ >

(70)

< ∗ > < ∗ > < ∗ > < ∗ > < < > > < < < > > > < > < ∗ > < < > >

(71)

< >

gdmMinMaxMeta

g d m G A M e t a

gdmMinMaxMeta

g d m G A M e t a

∼ ∗ ∗ ∗ ∗ ∗

(72)

∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ < > < < < > > > < < < > > > ∗

(73)

(74)

∗ ∗

(75)

(76)
(77)

< >

gdmValue

g d m D a t a

gdmValue

g d m D a t a

g d m M e s h

m M e s h

(78)
(79)
(80)

참조

관련 문서

 표본연구의 오류를 최소화하는 방법: 모집단으로부터 표 본을 여러 번 선정하여 개별 표본들을 조사하고 개별표 본으로부터 나오는 평균값의

무게 응답자의 연령, 상표의 매출 산술평균 모수통계..

한국인 심전도 진단 데이터 기상관측 데이터. 항공우주소재 물성 데이터

Through our Cocoa Plan we work to improve the lives of farmers and address the root causes of child labor in our cocoa supply chain.

우리나라는 음성통화 요금에 비해 데이터 요금이 상대 적으로 저렴: 음성- 데이터 간 요금 리밸런싱 시 데이터 다량 이용자는 음성통화 인하에 대한 혜택을 누릴 수

CIO와 CTO는 고급 AI 구현 기술을 보유한 조직이 설문 응답자들에 비해 이미 주도권을 잡고 있는, 인프라 및 사이버 보안에서부터 데이터 관리 및 개발

 데이터베이스 개발자는 Oracle 8이나 IBM 의 DB2와 같은 데이터베이스 관리 시스템 에서 데이터 내용, 관계, 그리고 구조를 명 시하고 수정하기 위해서

제4장