[Research] BHive(1)

gyeong·2020년 10월 6일
0

Research

목록 보기
1/2

BHive


A Benchmark Suite and Measurement Framework for Validating x86-64 Basic Block Performance Models

git repository: https://github.com/ithemal/bhive



Research


BHive는 basic block의 throughtput (clock cycle count) 를 측정하는 오픈소스이다.

프로그램 context에서 basic block을 추출할 수는 있으나 그 basic block을 실행시키는 것은 어려운 일이다. (basic block에서 메모리 접근이 있을 경우 crashing 문제 등)
BHive는 임의의 basic block을(메모리 접근이 있는 경우에도) 실행시켜 troughput을 측정할 수 있는 환경을 제공한다.

현재 이 오픈소스를 활용하여 basic block의 power를 측정하는 연구를 진행하고 있다.

✔️ BHive의 Throughput 측정 방법

BHive 의 basic block throughput 측정의 핵심은 basic block을 몇 차례 unrolling한 다음 측정한 latency를 unroll factor로 나눈다는 것이다.
(unrolling 개념 처음 접했다. 생소하다. 아직 조금 추상적이다.)

throughput 측정 과정을 구체적으로 보자면, 서로 다른 두 unroll factor를 사용하여 latency를 측정한 다음, latency 값의 차이를 unrolling 변수의 차이로 나눈다.
BHive 논문 equation 2번을 보면 나온다.

추가) unroll_factor는 unroll횟수를 의미한다.

// copy the *unrolled* user code
unsigned char *code_dest = code_end;
int i;
for (i = 0; i < unroll_factor; i++) {
  memcpy(code_dest, code_to_test, code_size);
  code_dest += code_size;
}

✔️ Outlier 제거

Section 4.B에 측정 후 어떻게 outlier를 제거하는지에 대한 방법이 나온다.
개념적인 내용은 논문에 나와있는 내용을 읽는 것으로 이해가 된다.
프로그램 Flow를 살펴볼 때 outlier 제거 코드가 따로 있을 테니 구체적인 내용은 코드를 통해 보면 될 것 같다.

✔️ Manage Arbitrary Memory Access: Remapping Virtual Paging

BHive는 임의의 메모리 접근을 처리하는 메커니즘을 가진다.
basic block이 접근하는 모든 virtual page를 하나의 physical page에 mapping하여 모든 데이터가 L1 cache에 있도록 하는 메커니즘이다.

우선, basic block이 사용하는 모든 virtual page를 (mapping table로부터) unmap시킨다. (basic block이 사용하는 instructino이 담긴 page는 제외)
그 다음 unrolled basic block을 fork된 프로세스로 실행시킨다.
fork된 child process는 parent process의 모니터링 하에 basic block을 실행시킨다.

unmapped virtual page에 대한 접근은 page fault를 발생시키고, 이에 대한 핸들링은 모니터링하던 parent process가 수행한다.
monitor process는 실행 중인 process에게(child process를 말하는 거겠지?) mapping을 생성하라 명한 뒤, mapping이 생성되면 실행을 재개한다.(마찬가지로 child가 재개하겠지? 코드를 통해 확인)

정정) mapping을 생성하는 건 monitor process (즉, parent process) 이다. 실행을 재개하는 건 child process이다.

profile
내가 보려고 만든 벨로그

0개의 댓글