Skip to content

Commit 7f665b3

Browse files
committed
cat: add BF16 kernels for Intel and ARM archs
This introduces kernels that use dot product intrinsics to trigger BF16 operations. These changes have been tested on the ARM Neoverse V2 and Intel Sapphire Rapids architectures.
1 parent 5f930f2 commit 7f665b3

File tree

16 files changed

+1957
-1751
lines changed

16 files changed

+1957
-1751
lines changed

src/counter_analysis_toolkit/Makefile

Lines changed: 50 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
PAPIDIR?=${PAPI_DIR}
21
USEMPI?=false
3-
LDFLAGS=-L$(PAPIDIR)/lib -lpapi -lm -lpthread -ldl -lrt
4-
INCFLAGS=-I$(PAPIDIR)/include
2+
LDFLAGS=-L${PAPI_DIR}/lib -lpapi -lm -lpthread -ldl -lrt
3+
INCFLAGS=-I${PAPI_DIR}/include
54
CFLAGS+=-g -Wall -Wextra
65
OPT0=-O0
76
OPT1=-O1
@@ -31,42 +30,38 @@ ifndef ARCH
3130
endif
3231

3332
## Architecture determines vector instruction set.
33+
# Note, we can't use -mavx512fp16 -mavx512bf16 for ANY AVX unless AVX512 is avail.
3434
ifeq ($(ARCH),X86)
3535
FLOP+=-mfma -DX86
36-
VECSRC=vec_fma_hp vec_fma_sp vec_fma_dp vec_nonfma_hp vec_nonfma_sp vec_nonfma_dp
37-
VEC_META=-DAVX128_AVAIL -DAVX256_AVAIL -DAVX512_AVAIL
38-
VEC128=-mavx -O0 -DX86 $(VEC_META) -DX86_VEC_WIDTH_128B
39-
VEC256=-mavx -O0 -DX86 $(VEC_META) -DX86_VEC_WIDTH_256B
40-
VEC512=-mavx512f -O0 -DX86 $(VEC_META) -DX86_VEC_WIDTH_512B
41-
VEC128_FMA=-mfma4 -mfma -O0 -DX86 $(VEC_META) -DX86_VEC_WIDTH_128B
42-
VEC256_FMA=-mfma4 -mfma -O0 -DX86 $(VEC_META) -DX86_VEC_WIDTH_256B
43-
VEC512_FMA=-mfma4 -mfma -mavx512f -O0 -DX86 $(VEC_META) -DX86_VEC_WIDTH_512B
44-
VEC=-mavx -O0 -DX86
45-
VEC_FMA=-mfma4 -mfma -O0 -DX86
46-
VEC_ALL=$(VEC) $(VEC_FMA) -O0 -DX86
36+
VECSRC=vec_dot_bf16 vec_fma_fp16 vec_fma_sp vec_fma_dp vec_nonfma_fp16 vec_nonfma_sp vec_nonfma_dp
37+
VEC_META=-DAVX128_AVAIL -DAVX256_AVAIL -DAVX512_AVAIL -DAVX512_FP16_AVAIL -DAVX512_BF16_AVAIL
38+
VEC128=-mavx -mavx512vl -mavx512fp16 -mavx512bf16 -O0 -DX86 $(VEC_META) -DX86_VEC_WIDTH_128B
39+
VEC256=-mavx -mavx512vl -mavx512fp16 -mavx512bf16 -O0 -DX86 $(VEC_META) -DX86_VEC_WIDTH_256B
40+
VEC512=-mavx -mavx512vl -mavx512fp16 -mavx512bf16 -O0 -DX86 $(VEC_META) -DX86_VEC_WIDTH_512B
41+
VEC128_FMA=-mfma4 -mfma -mavx512vl -mavx512fp16 -mavx512bf16 -O0 -DX86 $(VEC_META) -DX86_VEC_WIDTH_128B
42+
VEC256_FMA=-mfma4 -mfma -mavx512vl -mavx512fp16 -mavx512bf16 -O0 -DX86 $(VEC_META) -DX86_VEC_WIDTH_256B
43+
VEC512_FMA=-mfma4 -mfma -mavx512vl -mavx512fp16 -mavx512bf16 -O0 -DX86 $(VEC_META) -DX86_VEC_WIDTH_512B
44+
VEC_ALL=-mavx -mavx512fp16 -mavx512bf16 -mfma4 -mfma -mavx512f -mavx512fp16 -mavx512bf16 -O0 -DX86 $(VEC_META)
4745
INSTR=-mavx512vl
4846
endif
4947
ifeq ($(ARCH),POWER)
5048
FLOP+=-maltivec -DPOWER
51-
VECSRC=vec_fma_hp.o vec_fma_sp.o vec_fma_dp.o vec_nonfma_hp.o vec_nonfma_sp.o vec_nonfma_dp.o
52-
VEC=-maltivec -DPOWER
53-
VEC_FMA=-maltivec -DPOWER
54-
VEC_ALL=$(VEC) -DPOWER
49+
VECSRC=vec_fma_fp16.o vec_fma_sp.o vec_fma_dp.o vec_nonfma_fp16.o vec_nonfma_sp.o vec_nonfma_dp.o
50+
VEC_ALL=-maltivec -DPOWER
5551
endif
5652
ifeq ($(ARCH),ARM)
57-
FLOP+=-march=armv8.2-a+fp16+sve -DARM
58-
VECSRC=vec_fma_hp.o vec_fma_sp.o vec_fma_dp.o vec_nonfma_hp.o vec_nonfma_sp.o vec_nonfma_dp.o
59-
VEC=-march=armv8.2-a+fp16+sve -O0 -DARM
60-
VEC_FMA=-march=armv8.2-a+fp16+sve -O0 -DARM
61-
VEC_ALL=$(VEC) -O0 -DARM
53+
VEC_META=-DBF16_AVAIL -DFP16_AVAIL
54+
FLOP+=-march=armv8.2-a+fp16+bf16+sve -DARM $(VEC_META)
55+
VECSRC=vec_dot_bf16.o vec_fma_fp16.o vec_fma_sp.o vec_fma_dp.o vec_nonfma_fp16.o vec_nonfma_sp.o vec_nonfma_dp.o
56+
VEC_ALL=-march=armv8.2-a+fp16+bf16+sve -O0 -DARM $(VEC_META)
6257
endif
6358

6459
all: branch.o d_cache eventstock.o flops i_cache instr vector
65-
make cat_collect PAPIDIR=$(PAPIDIR)
60+
make cat_collect
6661

6762
d_cache: timing_kernels.o prepareArray.o compar.o dcache.o
6863

69-
i_cache: icache.o icache_seq_kernel_0.o
64+
i_cache: icache.o icache_seq_kernel.o
7065

7166
vector: weak_symbols.o vec.o vec_scalar_verify.o $(VECSRC)
7267

@@ -92,15 +87,15 @@ flops: flops.c flops.h cat_arch.h
9287
$(CC) $(CFLAGS) $(FLOP) $(OPT1) $(INCFLAGS) -c flops.c -o flops.o
9388

9489
icache.o: icache.c icache.h
95-
bash gen_seq_dlopen.sh
90+
bash gen_seq_dlopen.sh ${PWD}
9691
$(CC) $(CFLAGS) $(OPT0) $(INCFLAGS) -c icache.c -o icache.o
9792

98-
icache_seq_kernel_0.o: icache_seq.c icache_seq.h
93+
icache_seq_kernel.o: icache_seq.c icache_seq.h icache_seq_kernel.c
9994
$(CC) $(CFLAGS) $(OPT0) $(INCFLAGS) -c icache_seq.c -o icache_seq.o
100-
$(CC) $(CFLAGS) $(OPT0) $(INCFLAGS) -fPIC -c icache_seq_kernel.c -o icache_seq_kernel_0.o
101-
$(CC) $(CFLAGS) $(OPT0) -shared -o icache_seq_kernel_0.so icache_seq_kernel_0.o
102-
bash replicate.sh
103-
rm icache_seq_kernel_0.o
95+
$(CC) $(CFLAGS) $(OPT0) $(INCFLAGS) -fPIC -c icache_seq_kernel.c -o icache_seq_kernel.o
96+
$(CC) $(CFLAGS) $(OPT0) -shared -o icache_seq_kernel_0.so icache_seq_kernel.o
97+
bash replicate.sh ${PWD}
98+
rm ${PWD}/icache_seq_kernel.o
10499

105100
instr: instructions.c instr.h
106101
-$(CC) -c $(CFLAGS) $(OPT2) -ftree-vectorize $(FLOP) $(INSTR) $(INCFLAGS) instructions.c -o instructions.o
@@ -114,48 +109,56 @@ vec.o: vec.c vec.h
114109
vec_scalar_verify.o: vec_scalar_verify.c vec_scalar_verify.h cat_arch.h
115110
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC_ALL) vec_scalar_verify.c
116111

117-
vec_fma_hp.o: vec_fma_hp.c vec_scalar_verify.h
118-
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC_FMA) vec_fma_hp.c
112+
vec_fma_fp16.o: vec_fma_fp16.c vec_scalar_verify.h
113+
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC_ALL) vec_fma_fp16.c
119114

120-
vec_fma_hp: vec_fma_hp.c vec_scalar_verify.h
121-
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC128_FMA) vec_fma_hp.c -o vec_fma_hp-128B.o
122-
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC256_FMA) vec_fma_hp.c -o vec_fma_hp-256B.o
123-
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC512_FMA) vec_fma_hp.c -o vec_fma_hp-512B.o
115+
vec_fma_fp16: vec_fma_fp16.c vec_scalar_verify.h
116+
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC128_FMA) vec_fma_fp16.c -o vec_fma_fp16-128B.o
117+
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC256_FMA) vec_fma_fp16.c -o vec_fma_fp16-256B.o
118+
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC512_FMA) vec_fma_fp16.c -o vec_fma_fp16-512B.o
119+
120+
vec_dot_bf16.o: vec_dot_bf16.c vec_scalar_verify.h
121+
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC_ALL) vec_dot_bf16.c
122+
123+
vec_dot_bf16: vec_dot_bf16.c vec_scalar_verify.h
124+
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC128_FMA) vec_dot_bf16.c -o vec_dot_bf16-128B.o
125+
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC256_FMA) vec_dot_bf16.c -o vec_dot_bf16-256B.o
126+
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC512_FMA) vec_dot_bf16.c -o vec_dot_bf16-512B.o
124127

125128
vec_fma_sp.o: vec_fma_sp.c vec_scalar_verify.h
126-
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC_FMA) vec_fma_sp.c
129+
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC_ALL) vec_fma_sp.c
127130

128131
vec_fma_sp: vec_fma_sp.c vec_scalar_verify.h
129132
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC128_FMA) vec_fma_sp.c -o vec_fma_sp-128B.o
130133
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC256_FMA) vec_fma_sp.c -o vec_fma_sp-256B.o
131134
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC512_FMA) vec_fma_sp.c -o vec_fma_sp-512B.o
132135

133136
vec_fma_dp.o: vec_fma_dp.c vec_scalar_verify.h
134-
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC_FMA) vec_fma_dp.c
137+
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC_ALL) vec_fma_dp.c
135138

136139
vec_fma_dp: vec_fma_dp.c vec_scalar_verify.h
137140
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC128_FMA) vec_fma_dp.c -o vec_fma_dp-128B.o
138141
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC256_FMA) vec_fma_dp.c -o vec_fma_dp-256B.o
139142
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC512_FMA) vec_fma_dp.c -o vec_fma_dp-512B.o
140143

141-
vec_nonfma_hp.o: vec_nonfma_hp.c vec_scalar_verify.h
142-
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC) vec_nonfma_hp.c
144+
vec_nonfma_fp16.o: vec_nonfma_fp16.c vec_scalar_verify.h
145+
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC_ALL) vec_nonfma_fp16.c
143146

144-
vec_nonfma_hp: vec_nonfma_hp.c vec_scalar_verify.h
145-
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC128) vec_nonfma_hp.c -o vec_nonfma_hp-128B.o
146-
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC256) vec_nonfma_hp.c -o vec_nonfma_hp-256B.o
147-
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC512) vec_nonfma_hp.c -o vec_nonfma_hp-512B.o
147+
vec_nonfma_fp16: vec_nonfma_fp16.c vec_scalar_verify.h
148+
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC128) vec_nonfma_fp16.c -o vec_nonfma_fp16-128B.o
149+
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC256) vec_nonfma_fp16.c -o vec_nonfma_fp16-256B.o
150+
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC512) vec_nonfma_fp16.c -o vec_nonfma_fp16-512B.o
148151

149152
vec_nonfma_sp.o: vec_nonfma_sp.c vec_scalar_verify.h
150-
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC) vec_nonfma_sp.c
153+
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC_ALL) vec_nonfma_sp.c
151154

152155
vec_nonfma_sp: vec_nonfma_sp.c vec_scalar_verify.h
153156
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC128) vec_nonfma_sp.c -o vec_nonfma_sp-128B.o
154157
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC256) vec_nonfma_sp.c -o vec_nonfma_sp-256B.o
155158
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC512) vec_nonfma_sp.c -o vec_nonfma_sp-512B.o
156159

157160
vec_nonfma_dp.o: vec_nonfma_dp.c vec_scalar_verify.h
158-
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC) vec_nonfma_dp.c
161+
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC_ALL) vec_nonfma_dp.c
159162

160163
vec_nonfma_dp: vec_nonfma_dp.c vec_scalar_verify.h
161164
-$(CC) -c $(CFLAGS) $(OPT1) $(INCFLAGS) $(VEC128) vec_nonfma_dp.c -o vec_nonfma_dp-128B.o

0 commit comments

Comments
 (0)