-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
177 lines (140 loc) · 7.1 KB
/
Copy pathMakefile
File metadata and controls
177 lines (140 loc) · 7.1 KB
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
# ppc-mma-kernels — build & test
#
# Cross-compiles the kernels for ppc64le and runs correctness tests under
# qemu-user (POWER10). On real Power10/Power11 hardware, set CROSS= and
# QEMU= empty to build and run natively:
#
# make CROSS= QEMU= test
#
# Layout for practitioners:
# src/*.cpp PRODUCTION kernels — these are what the patches
# in patches/ integrate into llama.cpp/ggml.
# src/reference/*.cpp the v1→v3 design evolution, kept for review and
# for the derivation in docs/DESIGN.md. Nothing
# integrates these.
#
# Production file → formats covered → integration patch:
# qbit_ppc_mma_v4.cpp Q1_0, Q2_0 (PrismML) 0001 (+0008 v4 upgrade)
# q4_k_ppc_mma.cpp Q4_K 0002
# q5_k_ppc_mma.cpp Q5_K 0002
# q6_k_ppc_mma.cpp Q6_K 0002
# q2_k_ppc_mma.cpp Q2_K 0002
# q3_k_ppc_mma.cpp Q3_K 0003
# iq4_ppc_mma.cpp IQ4_NL, IQ4_XS, MXFP4 0003, 0007
# legacy_ppc_mma.cpp Q4_1, Q5_0, Q5_1 0004
# iq_grid_ppc_mma.cpp TQ1_0, TQ2_0, IQ2_XXS/XS/S, 0005, 0007, 0008
# IQ3_XXS/S, IQ1_S/M, NVFP4
#
# Targets: make help
CROSS ?= powerpc64le-linux-gnu-
CXX ?= $(CROSS)g++
SYSROOT ?= /usr/powerpc64le-linux-gnu
QEMU ?= qemu-ppc64le -cpu power10 -L $(SYSROOT)
CXXFLAGS ?= -O3 -mcpu=power10 -Wall -Wextra
BUILD := build
# ---- production test suites (format-complete, patch-backed) ----
PROD_TESTS := \
$(BUILD)/qbit_test \
$(BUILD)/q2_k_test $(BUILD)/q3_k_test $(BUILD)/q4_k_test \
$(BUILD)/q5_k_test $(BUILD)/q6_k_test \
$(BUILD)/iq4_test $(BUILD)/legacy_test $(BUILD)/iq_grid_test $(BUILD)/iq_grid_pp_test \
$(BUILD)/iq_grid_lxvp_test
# ---- independent decoder cross-checks (vs vendored ggml dequantize_row) ----
XCHECK_TESTS := \
$(BUILD)/xcheck_grid $(BUILD)/xcheck_iq4 $(BUILD)/xcheck_cache
# ---- reference (design-history) suites ----
REF_TESTS := \
$(BUILD)/ref_q1_v1_test $(BUILD)/ref_q2_v1_test \
$(BUILD)/ref_q1_v2_test $(BUILD)/ref_qbit_v3_test
BENCH := $(BUILD)/qbit_bench $(BUILD)/ref_q1_v2_bench $(BUILD)/ref_qbit_v3_bench
all: $(PROD_TESTS) $(XCHECK_TESTS) $(REF_TESTS) $(BENCH)
$(BUILD):
mkdir -p $(BUILD)
# ---- production ----
$(BUILD)/qbit_test: src/qbit_ppc_mma_v4.cpp | $(BUILD)
$(CXX) $(CXXFLAGS) -DQBIT4_TEST $< -o $@
$(BUILD)/q2_k_test: src/q2_k_ppc_mma.cpp | $(BUILD)
$(CXX) $(CXXFLAGS) -DQ2K_TEST $< -o $@
$(BUILD)/q3_k_test: src/q3_k_ppc_mma.cpp | $(BUILD)
$(CXX) $(CXXFLAGS) -DQ3K_TEST $< -o $@
$(BUILD)/q4_k_test: src/q4_k_ppc_mma.cpp | $(BUILD)
$(CXX) $(CXXFLAGS) -DQ4K_TEST $< -o $@
$(BUILD)/q5_k_test: src/q5_k_ppc_mma.cpp | $(BUILD)
$(CXX) $(CXXFLAGS) -DQ5K_TEST $< -o $@
$(BUILD)/q6_k_test: src/q6_k_ppc_mma.cpp | $(BUILD)
$(CXX) $(CXXFLAGS) -DQ6K_TEST $< -o $@
$(BUILD)/iq4_test: src/iq4_ppc_mma.cpp | $(BUILD)
$(CXX) $(CXXFLAGS) -DIQ4_TEST $< -o $@
$(BUILD)/legacy_test: src/legacy_ppc_mma.cpp | $(BUILD)
$(CXX) $(CXXFLAGS) -DLEGACY_TEST $< -o $@
$(BUILD)/iq_grid_test: src/iq_grid_ppc_mma.cpp src/iq_grids.h | $(BUILD)
$(CXX) $(CXXFLAGS) -DIQGRID_TEST $< -o $@
# accumulator ping-pong variant (hardware experiment #1; see BENCHMARKS-QEMU.md)
$(BUILD)/iq_grid_pp_test: src/iq_grid_ppc_mma.cpp src/iq_grids.h | $(BUILD)
$(CXX) $(CXXFLAGS) -DIQGRID_TEST -DIQGRID_PINGPONG $< -o $@
# ISA 3.1 vector-pair loads (hardware experiment #2; DESIGN.md)
$(BUILD)/iq_grid_lxvp_test: src/iq_grid_ppc_mma.cpp src/iq_grids.h | $(BUILD)
$(CXX) $(CXXFLAGS) -DIQGRID_TEST -DIQGRID_LXVP $< -o $@
# ---- decoder cross-checks: repo decoders vs ggml's dequantize_row,
# vendored verbatim from the pinned fork (scripts/extract-xcheck-ref.py).
# -Wno-unused-function: each harness uses only its slice of the included
# kernel TU and reference surface.
$(BUILD)/xcheck_grid: src/xcheck_grid.cpp src/iq_grid_ppc_mma.cpp src/iq_grids.h src/xcheck_ggml_ref.h | $(BUILD)
$(CXX) $(CXXFLAGS) -Wno-unused-function $< -o $@
$(BUILD)/xcheck_iq4: src/xcheck_iq4.cpp src/iq4_ppc_mma.cpp src/xcheck_ggml_ref.h | $(BUILD)
$(CXX) $(CXXFLAGS) -Wno-unused-function $< -o $@
# cache policy at N > capacity — the regime both shipped cache defects
# lived in. Arch-independent; src/ppc_pack_cache.cpp is the canonical
# copy that patch 0016 carries into ggml verbatim.
$(BUILD)/xcheck_cache: src/xcheck_cache.cpp src/ppc_pack_cache.cpp | $(BUILD)
$(CXX) $(CXXFLAGS) -Wno-unused-function $< -o $@ -lpthread
$(BUILD)/qbit_bench: src/qbit_ppc_mma_v4.cpp | $(BUILD)
$(CXX) $(CXXFLAGS) -DQBIT4_BENCH $< -o $@
# ---- reference (design history; see docs/DESIGN.md) ----
$(BUILD)/ref_q1_v1_test: src/reference/q1_0_ppc_mma.cpp | $(BUILD)
$(CXX) $(CXXFLAGS) -DQ1MMA_TEST $< -o $@
$(BUILD)/ref_q2_v1_test: src/reference/q2_0_ppc_mma.cpp | $(BUILD)
$(CXX) $(CXXFLAGS) -DQ2MMA_TEST $< -o $@
$(BUILD)/ref_q1_v2_test: src/reference/q1_0_ppc_mma_v2.cpp | $(BUILD)
$(CXX) $(CXXFLAGS) -DQ1MMA_TEST $< -o $@
$(BUILD)/ref_qbit_v3_test: src/reference/qbit_ppc_mma_v3.cpp | $(BUILD)
$(CXX) $(CXXFLAGS) -DQBIT_TEST $< -o $@
$(BUILD)/ref_q1_v2_bench: src/reference/q1_0_ppc_mma_v2.cpp | $(BUILD)
$(CXX) $(CXXFLAGS) -DQ1MMA_BENCH $< -o $@
$(BUILD)/ref_qbit_v3_bench: src/reference/qbit_ppc_mma_v3.cpp | $(BUILD)
$(CXX) $(CXXFLAGS) -DQBIT_BENCH $< -o $@
# ---- entry points ----
test: $(PROD_TESTS) $(XCHECK_TESTS) $(REF_TESTS)
@for t in $(PROD_TESTS) $(XCHECK_TESTS) $(REF_TESTS); do echo "== $$t"; $(QEMU) ./$$t || exit 1; done
@echo "ALL SUITES PASSED"
test-xcheck: $(XCHECK_TESTS)
@for t in $(XCHECK_TESTS); do echo "== $$t"; $(QEMU) ./$$t || exit 1; done
@echo "ALL DECODER CROSS-CHECKS PASSED"
test-production: $(PROD_TESTS)
@for t in $(PROD_TESTS); do echo "== $$t"; $(QEMU) ./$$t || exit 1; done
@echo "ALL PRODUCTION SUITES PASSED"
test-reference: $(REF_TESTS)
@for t in $(REF_TESTS); do echo "== $$t"; $(QEMU) ./$$t || exit 1; done
@echo "ALL REFERENCE SUITES PASSED"
bench: $(BENCH)
@for b in $(BENCH); do echo "== $$b"; $(QEMU) ./$$b; done
@echo "(qemu timings are an instruction-count proxy only; benchmark on hardware)"
help:
@echo "ppc-mma-kernels targets:"
@echo " make test build + run all correctness suites (production + reference)"
@echo " make test-production only the 9 production suites (what the patches integrate)"
@echo " make test-reference only the v1-v3 design-history suites"
@echo " make test-xcheck decoder cross-checks vs vendored ggml dequantize_row"
@echo " make bench qemu instruction-count proxy benchmarks"
@echo " make all build everything without running"
@echo " make clean remove build/"
@echo ""
@echo "Native Power10/11: make CROSS= QEMU= test"
@echo "Versioned compiler: make CXX=powerpc64le-linux-gnu-g++-14 test"
@echo "Strict build: make CXXFLAGS='-O3 -mcpu=power10 -Wall -Wextra -Werror' test"
@echo ""
@echo "Integration into llama.cpp: see patches/ + docs/INTEGRATION.md,"
@echo "or run scripts/build-bonsai-power.sh for the one-command build."
clean:
rm -rf $(BUILD)
.PHONY: all test test-production test-reference bench help clean