2525// #include <cpuid.h>
2626// #include <libc/sysv/consts/hwcap.h>
2727#include < stdio.h>
28+ #include < sys/auxv.h>
2829#include < cassert>
2930// #include "llamafile.h"
3031
31- // ARM64-specific headers and constants
32- #ifdef __aarch64__
33- #include < sys/auxv.h>
34- #include < asm/hwcap.h>
35- #endif
36-
3732static const struct GemmFuncs {
3833 bool (*sgemm)(long , long , long , const void *, long , const void *, long , void *, long , int , int , int , int , int , int , int );
3934 bool (*mixmul)(const struct ggml_compute_params *, const struct ggml_tensor *, const struct ggml_tensor *, const struct ggml_tensor *, struct ggml_tensor *);
@@ -42,7 +37,7 @@ static const struct GemmFuncs {
4237 // typeof(llamafile_mixmul)* mixmul;
4338 // typeof(llamafile_mixmul_iqk)* iqk_mixmul = iqk_mul_mat_moe_unsupported;
4439 GemmFuncs () {
45- #if defined(__x86_64__) || defined(_M_X64)
40+ // #if defined(__x86_64__) || defined(_M_X64)
4641 // if (X86_HAVE(AVX)) {
4742 // if (X86_HAVE(FMA)) {
4843 // if (X86_HAVE(AVX2)) {
@@ -95,83 +90,18 @@ static const struct GemmFuncs {
9590 // mixmul = llamafile_mixmul_unsupported;
9691 // }
9792
98- #if defined(__AVX__)
99- #if defined(__FMA__) || (defined(_MSC_VER) && (defined(__AVX2__) || defined(__AVX512F__)))
100- #if defined(__AVX2__)
101- #if defined(__AVX512F__)
102- #if defined(__AVX512VL__) && defined(__AVX512BW__) && defined(__AVX512DQ__) && defined(__AVX512VNNI__) && defined(__AVX512BF16__)
103- // AMD Zen4+ (2023-)
104- sgemm = llamafile_sgemm_amd_zen4;
105- mixmul = llamafile_mixmul_amd_zen4;
106- iqk_mixmul = iqk_mul_mat_moe_zen4;
107- #else
108- // Intel Xeon Skylake+ (2015-)
109- sgemm = llamafile_sgemm_amd_avx512f;
110- mixmul = llamafile_mixmul_amd_avx512f;
111- iqk_mixmul = iqk_mul_mat_moe;
112- #endif
113- #elif defined(__AVXVNNI__)
114- // Intel Alderlake (2021-)
115- sgemm = llamafile_sgemm_amd_avxvnni;
116- mixmul = llamafile_mixmul_amd_avxvnni;
117- iqk_mixmul = iqk_mul_mat_moe;
118- #else
119- // Intel Haswell/Broadwell/Skylake (2013-2020)
120- // AMD Excavator (2015-2022)
121- sgemm = llamafile_sgemm_amd_avx2;
122- mixmul = llamafile_mixmul_amd_avx2;
123- #if defined(__F16C__)
124- iqk_mixmul = iqk_mul_mat_moe;
125- #endif
126- #endif
127- #else
128- // AMD Piledriver (2011-2014)
129- sgemm = llamafile_sgemm_amd_fma;
130- mixmul = llamafile_mixmul_amd_fma;
131- #if defined(__F16C__)
132- iqk_mixmul = iqk_mul_mat_moe;
133- #endif
134- #endif
135- #else
136- // Intel Sandybridge/Ivybridge (2010-2012)
137- // AMD Bulldozer (2011)
138- sgemm = llamafile_sgemm_amd_avx;
139- mixmul = llamafile_mixmul_amd_avx;
140- #endif
141- #else
142- // AMD K8/Barcelona (2003-2010)
143- // Intel Core/Nehalem (2006-2009)
144- sgemm = llamafile_sgemm_unsupported;
145- mixmul = llamafile_mixmul_unsupported;
146- #endif
14793
148- #elif defined(__aarch64__)
149- // ARM64 hardware capability detection
150- long hwcap = 0 ;
151- #ifdef __linux__
152- hwcap = getauxval (AT_HWCAP );
153- if ((hwcap & HWCAP_FPHP ) && // fp16 scalar isa (ID_AA64PFR0_EL1.FP == 1)
154- (hwcap & HWCAP_ASIMDHP ) && // fp16 vector isa (ID_AA64PFR0_EL1.AdvSIMD == 1)
155- (hwcap & HWCAP_ASIMDDP )) { // dotprod isa (ID_AA64ISAR0_EL1.DP == 1)
94+ // #elif defined(__aarch64__)
95+ // long hwcap = getauxval(AT_HWCAP);
96+ // if ((hwcap & HWCAP_FPHP) && // fp16 scalar isa (ID_AA64PFR0_EL1.FP == 1)
97+ // (hwcap & HWCAP_ASIMDHP) && // fp16 vector isa (ID_AA64PFR0_EL1.AdvSIMD == 1)
98+ // (hwcap & HWCAP_ASIMDDP)) { // dotprod isa (ID_AA64ISAR0_EL1.DP == 1)
15699 // e.g. Apple M1, Raspberry Pi 5
157100 sgemm = llamafile_sgemm_arm82;
158101 mixmul = llamafile_mixmul_arm82;
159102 iqk_mixmul = iqk_mul_mat_moe_arm82;
160- } else {
161- // ARM64 baseline ISA
162- sgemm = llamafile_sgemm_arm80;
163- mixmul = llamafile_mixmul_arm80;
164- }
165- #else
166- // Non-Linux ARM64 systems (e.g., macOS)
167- // Use baseline ARM64 implementation
168- sgemm = llamafile_sgemm_arm80;
169- mixmul = llamafile_mixmul_arm80;
170- #endif
171- #else
172- sgemm = llamafile_sgemm_unsupported;
173- mixmul = llamafile_mixmul_unsupported;
174- #endif
103+
104+ // #endif
175105 }
176106} funcs;
177107
0 commit comments