봉황대 in CS

[Shell Script] sed command를 통해 Performance breakdown 코드 실행하기 본문

Data Centric Computing

[Shell Script] sed command를 통해 Performance breakdown 코드 실행하기

등 긁는 봉황대 2024. 7. 3. 00:01

방학을 맞이하고 연구 버닝 타임으로 복귀하면서..
 
학기 중에는 바빠서 미처 진행하지 못하고 Todo로만 남겨뒀던,
불필요한 반복 작업들을 자동화하는 스크립트들을 새로 구현하고 기존 스크립트를 정비하였다.
 

  • Throughput 실험 결과를 저장한 파일들을 읽어서, 각 실험마다 평균값을 계산해 주는 Python 스크립트 구현
    → 기존 스크립트에 연결 완료, 따라서 throughput 측정 시마다 자동으로 계산하여 파일에 출력해 줌
  • Throughput 실험 결과가 담긴 파일들을 저장하는 디렉터리 경로 지정 자동화 완료
    방법 : Shell script 날짜 변수 사용 $(date +"%y%m%d")
  • Performance breakdown 시, macro를 자동으로 지정 및 해제해 주는 스크립트 구현 완료

 
오늘 처리한 3개의 일들 중, 가장 잘했다고 느끼는 breakdown 자동화 방법을 이 글에 남기고자 한다.
 
 
 

Background: Performance breakdown ?


Performance breakdown은 어떠한 연산을 진행할 때,
어떤 컴포넌트에서 얼마만큼의 시간이 소요되는지 또는 방문하는 횟수는 얼마인지 등을 측정하여 분석하는 것을 말한다.
 
이 과정을 통해서 성능 상의 병목 지점을 찾아낼 수 있기 때문에, 매우 막중한 역할을 담당하는 코드들이라고 할 수 있다.
 
하지만 실제 throughput을 측정하는 본 실험에서는 해당 코드들이 들어가면 안 된다.
시간을 측정하고 저장하는 부분 때문에 성능이 훨씬 낮게 측정되기 때문이다.
 
 
따라서 나는 BREAK_DOWN이라는 매크로를 사용하게 되었다.
해당 매크로가 정의되었을 때만 breakdown 관련 코드를 같이 컴파일하여, 원할 때에만 정밀 측정을 진행하도록 구현할 수 있다.
 

#define BREAK_DOWN

 
위 사진에서 볼 수 있듯이, #ifdef ~ #endif 형태로 breakdown 코드를 감싸고 있다.

#ifdef BREAK_DOWN
// codes for performance break down
#endif

 
본 실험을 돌릴 때에는 #define BREAK_DOWN 부분을 주석처리해 두고, (주석처리해 둔 것이 default 상태)
breakdown을 해서 여러 metric들을 측정해야 할 때에만 주석을 해제해서 실행시키면 된다.
 
 
 

기존 비효율적인 방법


매크로를 지정하면 여러 파일에서 공유하는 것으로 알고 있는데 ,,
 
Workload가 정의되어 있는 cpp 파일과 자료구조들이 정의되어 있는 header 파일을 섞어 써서 그런 건지 모르겠으나,
나의 시나리오는 cpp 파일에 있는 놈만 매크로를 정의하면 나머지 파일들도 쭉 정의되는 것이었는데 그렇게 실행되지 않았다.
서로 다른 디렉터리에 있어서 그런가 ?

(240801 추가 : 왜인지 깨달음. 글 맨 아래에 작성.)


결국에는 breakdown 코드가 정의되어 있는 모든 파일에 #define BREAK_DOWN 부분을 작성하고,
breakdown을 진행해야 할 때마다 주석을 일일이 해제하고 다시 지정하고.. 굉장히 비효율적으로 진행하였다.
 
그래도 갓젵브레인 갓라이온을 써서 그나마 다행이긴 했다 ㅠ
 

 
 
 
 

해결법: sed command


이 과정이 너무너무 귀찮았고, 어떻게 자동화할 수 없나.. 하면서 해결 방법을 고민하던 중.
 
파일의 특정 문자를 치환시켜 주거나 특정 행을 삭제하는 등 여러 기능을 가진 sed command(스트림 편집기)를 발견하게 되었다.

 

Sed Command in Linux/Unix with examples - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 
syntax

sed OPTIONS... [SCRIPT] [INPUTFILE...]

 
 
 
Breakdown 귀차니즘 문제를 해결하기 위해서, 진행 flow를 정리해 봤을 때 다음과 같았다.
 

  1. //#define BREAK_DOWN이 작성되어 있는 파일들에 접근하여, #define BREAK_DOWN으로 변경한다.
  2. workload를 실행하여 breakdown을 진행하고, 측정 결과를 파일에 출력한다.
  3. 다시 코드를 //#define BREAK_DOWN으로 변경한다.

 
굉장히 간결하다. 1번과 3번에서 sed command를 통해 주석 부분을 변경해주기만 하면 되는 것이었다.

sed -i 's|<검색할 패턴>|<대체할 문자열>|' "수정할 파일"
  • -i option : sed가 파일을 직접 수정하도록 한다. (i : in-place를 의미)
  • s : substitute, 대체 명령

 
 
새로 작성한 breakdown용 스크립트(의 뼈대)는 다음과 같다.

#!/bin/bash

// list of file paths
files="..."

// 1. set macro
for file in $files; do
    sed -i 's|//#define BREAK_DOWN|#define BREAK_DOWN|' "$file"
done

// 2. exec workload

// 3. unset macro
for file in $files; do
    sed -i 's|#define BREAK_DOWN|//#define BREAK_DOWN|' "$file"
done

 
짱짱 ㅎ_____ㅎ
이제 행복하게 실험을 돌릴 수 있겠다 ㅎㅎ
 
 

왜 macro 정의가 공유되지 않았는지 깨달았다 .. (240801 추가)


모든 놈들이 동일하게 include 하고 있는 header 파일이 없었기 때문이었다..

 

따라서

1. 아래 header 파일을 정의 (include/break_down.h)

#ifndef BREAK_DOWN_H
//#define BREAK_DOWN_H

//#define BREAK_DOWN

#endif // BREAK_DOWN_H

 

2. breakdown 코드가 정의되어 있는 모든 파일에 위 header 파일을 include

 

3. script 파일에서는 include/break_down.h 파일에만 sed command를 실행하도록 변경

하면 된다!

 

굳 ~~~

special thanks to JS

 

 

반응형
Comments