티스토리 뷰

Tech-Tip

행렬곱 - Xilinx HLS 실험 2

eulia1211 2023. 2. 22. 22:16

행렬곱을 이용한 HLS 최적화 실험 2번째로, Array Partition에 대해서 실험을 해보려고 한다.

Array Partition은 단일 메모리를 분할하여 다수의 메모리 포트를 사용가능하게 함으로써 메모리 접근의 성능을 향상시켜 전체 행렬곱의 성능을 향상시키는데 목적이 있다.

void matmul_3(hls::stream<axis_data> &in_A, hls::stream<axis_data> &out_C)
{
	#pragma HLS INTERFACE mode=axis register_mode=both port=in_A register
	#pragma HLS INTERFACE mode=axis register_mode=both port=out_C  register
	#pragma HLS INTERFACE mode=ap_ctrl_none port=return

	Mat_Dtype input_A[MATSIZE][MATSIZE];
	#pragma HLS ARRAY_PARTITION dim=2 type=complete variable=input_A
	Mat_Dtype input_B[MATSIZE][MATSIZE];
	#pragma HLS ARRAY_PARTITION dim=1 type=complete variable=input_B
	Mat_Dtype output_C[MATSIZE][MATSIZE];

사실 Pragma를 사용하지 않은 경우와 성능이 같게 나왔는데, 이는 최적화 pragma를 지정하지 않아도 기본적으로 어느정도의 최적화가 진행됨을 의미한다.

 

Pragma를 사용하지 않은 경우의 성능과 같다.

Partition의 type을 block 및 cycle로 진행하고 factor등을 조정해보았는데, 메모리로 유도되는 resource가 multiple read port (RAM_1WNR)를 지원하여 성능상에 차이는 없었다.

 

예를 들어, 다음과 같은 pragma를 적용한 경우를 살펴보자.

	Mat_Dtype input_A[MATSIZE][MATSIZE];
	#pragma HLS ARRAY_PARTITION dim=2 factor=2 type=block variable=input_A
	Mat_Dtype input_B[MATSIZE][MATSIZE];
	#pragma HLS ARRAY_PARTITION dim=1 factor=2 type=block variable=input_B
	Mat_Dtype output_C[MATSIZE][MATSIZE];

이때의 성능은 위의 complete 구조를 사용한 경우와 같으나, storage resource는 다르게 할당된다.

input_A와 input_B array가 각각 두개의 rom_np로 할당됨을 알 수 있다.

 

만약 아래와 같이 complete 구조를 사용하는 경우를 생각해 보면 array 구조상의 차이는 파악할 수 있다.

	Mat_Dtype input_A[MATSIZE][MATSIZE];
	#pragma HLS ARRAY_PARTITION dim=2 type=complete variable=input_A
	Mat_Dtype input_B[MATSIZE][MATSIZE];
	#pragma HLS ARRAY_PARTITION dim=1 type=complete variable=input_B
	Mat_Dtype output_C[MATSIZE][MATSIZE];

 

위의 그림에서 보든 input_A와 input_B가 각각 8개의  ram_1p로 나누어짐을 알 수 있다.

 

Storage Types.

 

Array Partition의 구조에 따른 성능 변화를 살펴보려면, 읽기 쓰기가 모두 적용되는 Array  등을 사용할 때 측정될 수 있을 것 같다. 현재와 같이 읽는 Array와 쓰는 Array가 구분되고 유도되는 storage resource로 RAM_1WNR 또는 ROM_NP 등 Multi-port resource가 사용되는 경우 성능상의 차이를 구분할 수 없게 된다.

 

만약, "pragma HLS bind_storage"를 사용하여 storage resource를 제한된 read port를 갖도록 제한하는 경우 partition의 구조에 따른 성능 차이가 나타날 것으로 예상한다.

 

- 참조: https://docs.xilinx.com/r/en-US/ug1399-vitis-hls/pragma-HLS-bind_storage

'Tech-Tip' 카테고리의 다른 글

최신 GPU Spec 체크  (0) 2023.05.21
행렬곱 - Xilinx HLS 실험 4  (0) 2023.02.23
행렬곱 - Xilinx HLS 실험 3  (0) 2023.02.23
행렬곱 - Xilinx HLS 실험 1  (1) 2023.02.22
Intel Quartus - Modelsim - 소프트웨어설치  (0) 2023.01.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/12   »
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
글 보관함