Pioneer
SCALE-SIM 뜯어보기 (6): single_layer_sim.py 본문
single_layer_sim는 simulator 인스턴스의 run(..)(line 50:57) 메서드로부터 최초 생성된다.
__init__(..) across line 13:69
18-20: Systolic Array의 구성 요소 인스턴스(피연산자 매트릭스, OS dataflow systolic compute, 이중버퍼 스크래치패드 메모리)
24-64: 리포트에 작성될 수치 변수 생성
66-69: 동작 관련 플래그 초기화
set_params(..) across line 71:97
이것 역시 이전의 동일한 이름을 가진 메서드처럼 파라미터를 세팅한다.
대신 계산 유닛이나 피연산자 매트릭스에 설정 파일에 있는 파라미터를 매핑한다는 점이 다르다.
93-94: Systolic Array의 행과 열 크기를 가져와 num_mac_unit에 저장한다.
여기서 num_mac_unit은 MAC(Multiply-and-ACcumulate) 유닛의 총 갯수를 의미한다.
run(..) across line 105:182
요약 흐름: 연산 행렬 준비 → 연산 시스템 설정 → 메모리 요구 및 시스템 설정 → 메모리 요청 서비스
1. 파라미터 확인
assert self.params_set_flag, 'Parameters are not set. Run set_params()'
2. 연산 행렬 준비
_, ifmap_op_mat = self.op_mat_obj.get_ifmap_matrix()
_, filter_op_mat = self.op_mat_obj.get_filter_matrix()
_, ofmap_op_mat = self.op_mat_obj.get_ofmap_matrix()
self.num_compute = self.topo.get_layer_num_ofmap_px(self.layer_id) \
* self.topo.get_layer_window_size(self.layer_id)
- 입력 특징맵, 필터, 출력 특징맵 행렬을 가져온다.
- 총 연산수(self.num_compute)를 계산한다.
3. 연산 시스템 설정
self.compute_system.set_params(
config_obj=self.config,
ifmap_op_mat=ifmap_op_mat,
filter_op_mat=filter_op_mat,
ofmap_op_mat=ofmap_op_mat
)
- 설정(self.config)에 따라 연산 시스템의 파라미터를 설정한다.
4. 메모리 요구 사항 계산
ifmap_prefetch_mat, filter_prefetch_mat = self.compute_system.get_prefetch_matrices()
ifmap_demand_mat, filter_demand_mat, ofmap_demand_mat = self.compute_system.get_demand_matrices()
- *_prefetch_mat: 읽기 버퍼에 필요한 사전 데이터
- *_demand_mat: 실제 연산에 필요한 메모리 데이터 요청
5. 메모리 시스템 초기화
if not self.memory_system_ready_flag:
word_size = 1 # 바이트 단위
active_buf_frac = 0.5 # 활성 버퍼 비율
# 메모리 크기와 대역폭 설정
ifmap_buf_size_kb, filter_buf_size_kb, ofmap_buf_size_kb = self.config.get_mem_sizes()
ifmap_buf_size_bytes = 1024 * ifmap_buf_size_kb
filter_buf_size_bytes = 1024 * filter_buf_size_kb
ofmap_buf_size_bytes = 1024 * ofmap_buf_size_kb
ifmap_backing_bw = filter_backing_bw = ofmap_backing_bw = 1
estimate_bandwidth_mode = False
# 사용자 지정 DRAM 대역폭 사용 여부
if self.config.use_user_dram_bandwidth():
bws = self.config.get_bandwidths_as_list()
ifmap_backing_bw = bws[0]
filter_backing_bw = bws[1]
ofmap_backing_bw = bws[2]
else:
# 기본 대역폭 추정
arr_row, arr_col = self.config.get_array_dims()
ifmap_backing_bw = 10
filter_backing_bw = 10
ofmap_backing_bw = arr_col
self.memory_system.set_params(
word_size=word_size,
ifmap_buf_size_bytes=ifmap_buf_size_bytes,
filter_buf_size_bytes=filter_buf_size_bytes,
ofmap_buf_size_bytes=ofmap_buf_size_bytes,
rd_buf_active_frac=active_buf_frac,
wr_buf_active_frac=active_buf_frac,
ifmap_backing_buf_bw=ifmap_backing_bw,
filter_backing_buf_bw=filter_backing_bw,
ofmap_backing_buf_bw=ofmap_backing_bw,
verbose=self.verbose,
estimate_bandwidth_mode=estimate_bandwidth_mode
)
- 메모리 시스템이 외부에서 설정되지 않은 경우, 내부적으로 초기화
- 메모리 버퍼 크기: 구성 객체(self.config)에서 읽어옴
- 대역폭 설정: 사용자 지정 대역폭 또는 기본값 사용
- 활성 버퍼 비율: 버퍼에서 데이터를 얼마나 효율적으로 사용할지 결정
6. 메모리 요청 서비스
if self.config.use_user_dram_bandwidth():
self.memory_system.set_read_buf_prefetch_matrices(
ifmap_prefetch_mat=ifmap_prefetch_mat,
filter_prefetch_mat=filter_prefetch_mat
)
self.memory_system.service_memory_requests(
ifmap_demand_mat, filter_demand_mat, ofmap_demand_mat
)
- 사전 로드(Prefetch):
- 사용자 지정 DRAM 대역폭이 활성화된 경우, prefetch 데이터를 읽기 버퍼에 설정
- 메모리 요청 서비스:
- IFMAP, 필터, OFMAP 데이터를 메모리 시스템을 통해 서비스
- 메모리 병목 상황이나 서비스 지연을 처리
7. 결과 상태 플래그 설정
self.runs_ready = True
그 외 통계 생성 메서드
save_traces(..):
- SRAM 및 DRAM 관련 액세스 트레이스를 CSV 파일로 저장
calc_report_data(..):
- 계산, 메모리 대역폭, 메모리 액세스와 관련된 다양한 통계 생성
- 총 사이클, 스톨 사이클, 계산 활용도(compute_util)
- SRAM 및 DRAM 대역폭 사용량 계산
다음은 scalesim/compute/operand_matrix.py에 대해 분석한다.
'HPC > SCALE-SIM' 카테고리의 다른 글
SCALE-SIM 뜯어보기 (5): simulator.py (0) | 2024.11.15 |
---|---|
SCALE-SIM 뜯어보기 (4): scale_config.py [pt.1] (0) | 2024.11.14 |
SCALE-SIM 뜯어보기 (3): topology_utils.py [pt.1] (0) | 2024.11.13 |
SCALE-SIM 뜯어보기 (2): 실행 진입점과 scalesim (0) | 2024.11.12 |
SCALE-SIM 뜯어보기 (1): 설치 및 테스트 (0) | 2024.11.08 |