Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Pioneer

SCALE-SIM 뜯어보기 (6): single_layer_sim.py 본문

HPC/SCALE-SIM

SCALE-SIM 뜯어보기 (6): single_layer_sim.py

hwkang 2024. 11. 26. 20:19

single_layer_simsimulator 인스턴스의 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에 대해 분석한다.