티스토리 뷰

Tech-Tip

행렬곱 - Xilinx HLS 실험 3

eulia1211 2023. 2. 23. 11:34

이번에는 행렬곱 연산의 정확도를 줄여 성능을 향상시키는 방법에 대한 실험을 진행한다.

 

기존의 코드와 비교하여 달라지는 좀은 행렬곱 연산시에 사용되는 array의 타입을 float에서 half (float)로 변환하는 것이다.

 

#ifdef solution4
#include <hls_half.h>
typedef float Mat_Dtype;
typedef half Mat_DtypeOp;	// 16 bit floating point
#endif

이전 코드에서 Array의 타입을 half 타입으로 재정의하고 아래와 같이 input_A와 input_B array의 타입을 수정된 half 타입으로 변경하였다.

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

	int row, col, index;
	Mat_DtypeOp res;

이와 같은 상황에서 합성을 진행하면 다음과 같은 결과를 만들어준다.

 

이전 코드의 결과와 비교하여 Latency는 살짝 늘었지만, Clock의 Estimated 부분이 줄어 들어 성능 향상의 여지를 가지고 온다. 더불어, LUT resource 사용이 크게 줄어드는 것을 확인할 수 있다.

 

이전에 얻었던 결과는 아래와 같다.

행렬곱의 연산을 float에서 half 타입으로 바꿈으로써, 

Clock Estimated: 7.256ns --> 6.865 ns

Latency cycle: 320 --> 331

BRAM: 15 --> 1

DSP: 40 --> 32

FF: 4882 --> 3309

LUT: 7279 --> 2745

 

LUT 자원의 획기적인 감소가 확인됨을 알 수 있다.

여기서, 중요한 점은 DMA 통신에 사용되는 데이터의 양은 여전히 같고 연산 시에만 half로 진행된다는 것이다.

기존의 행렬곱 가속기와 비교하여 half type을 통해서 얼마나 성능이 좋아졌는지 살펴보기 위해 기존의 matmul 1_0 ip와 향상된 matmul 4_0 ip를 추가하여 실험을 진행하였다.

 

다음과 같은 성능 향상이 측정되었다.

기존: 16.004204 us

개선: 15.085286 us

 

float와 half float에 대한 표현은 아래 자료를 살펴보자.

출처(ref):&nbsp;https://www.nipslab.org/files/OPRECOMP_Perugia_summer_school_July_2018_Diamantopoulos_IBM.pdf

 

만약 DMA의 데이터 전달도 half type을 고려하여 진행하는 경우 성능향상 폭은 더 늘어날 것으로 기대한다.

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

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