mirror of
https://github.com/ggerganov/whisper.cpp.git
synced 2025-06-23 19:21:39 +02:00
ggml-cpu : remove unnecesary arm feature detection (llama/14281)
Support for Arm runtime feature detection has now been added to GGML_CPU_ALL_VARIANTS. This removes the old and not very functional code.
This commit is contained in:
parent
cef59c1e26
commit
71adde9203
@ -256,7 +256,6 @@ void ggml_gemv_q4_0_4x4_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
UNUSED(blocklen);
|
UNUSED(blocklen);
|
||||||
|
|
||||||
#if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_DOTPROD)
|
#if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_DOTPROD)
|
||||||
if (ggml_cpu_has_neon() && ggml_cpu_has_dotprod()) {
|
|
||||||
const block_q4_0x4 * b_ptr = (const block_q4_0x4 *) vx;
|
const block_q4_0x4 * b_ptr = (const block_q4_0x4 *) vx;
|
||||||
|
|
||||||
for (int c = 0; c < nc; c += ncols_interleaved) {
|
for (int c = 0; c < nc; c += ncols_interleaved) {
|
||||||
@ -294,7 +293,6 @@ void ggml_gemv_q4_0_4x4_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
s += ncols_interleaved;
|
s += ncols_interleaved;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
#endif // #if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_DOTPROD)
|
#endif // #if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_DOTPROD)
|
||||||
float sumf[4];
|
float sumf[4];
|
||||||
int sumi;
|
int sumi;
|
||||||
@ -341,7 +339,6 @@ void ggml_gemv_q4_0_4x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
UNUSED(blocklen);
|
UNUSED(blocklen);
|
||||||
|
|
||||||
#if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_DOTPROD)
|
#if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_DOTPROD)
|
||||||
if (ggml_cpu_has_neon() && ggml_cpu_has_dotprod()) {
|
|
||||||
const block_q4_0x4 * b_ptr = (const block_q4_0x4 *) vx;
|
const block_q4_0x4 * b_ptr = (const block_q4_0x4 *) vx;
|
||||||
|
|
||||||
for (int c = 0; c < nc; c += ncols_interleaved) {
|
for (int c = 0; c < nc; c += ncols_interleaved) {
|
||||||
@ -384,7 +381,6 @@ void ggml_gemv_q4_0_4x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
s += ncols_interleaved;
|
s += ncols_interleaved;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
#endif // #if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_DOTPROD)
|
#endif // #if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_DOTPROD)
|
||||||
float sumf[4];
|
float sumf[4];
|
||||||
int sumi;
|
int sumi;
|
||||||
@ -432,7 +428,7 @@ void ggml_gemv_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
|
|
||||||
#if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__)
|
#if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__)
|
||||||
#if defined(__ARM_FEATURE_SVE)
|
#if defined(__ARM_FEATURE_SVE)
|
||||||
if (ggml_cpu_has_sve() && ggml_cpu_get_sve_cnt() == QK8_0) {
|
if (ggml_cpu_get_sve_cnt() == QK8_0) {
|
||||||
const void * b_ptr = vx;
|
const void * b_ptr = vx;
|
||||||
const void * a_ptr = vy;
|
const void * a_ptr = vy;
|
||||||
float * res_ptr = s;
|
float * res_ptr = s;
|
||||||
@ -547,7 +543,6 @@ void ggml_gemv_iq4_nl_4x4_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
UNUSED(blocklen);
|
UNUSED(blocklen);
|
||||||
|
|
||||||
#if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_DOTPROD)
|
#if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_DOTPROD)
|
||||||
if (ggml_cpu_has_neon() && ggml_cpu_has_dotprod()) {
|
|
||||||
const int8x16_t kvalues = vld1q_s8(kvalues_iq4nl);
|
const int8x16_t kvalues = vld1q_s8(kvalues_iq4nl);
|
||||||
const block_q8_0 * a_ptr = (const block_q8_0 *) vy;
|
const block_q8_0 * a_ptr = (const block_q8_0 *) vy;
|
||||||
float * res_ptr = s;
|
float * res_ptr = s;
|
||||||
@ -594,7 +589,6 @@ void ggml_gemv_iq4_nl_4x4_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
vst1q_f32(res_ptr + x * 4, sumf);
|
vst1q_f32(res_ptr + x * 4, sumf);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
#endif // #if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON)
|
#endif // #if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON)
|
||||||
{
|
{
|
||||||
float sumf[4];
|
float sumf[4];
|
||||||
@ -643,8 +637,7 @@ void ggml_gemm_q4_0_4x4_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
UNUSED(ncols_interleaved);
|
UNUSED(ncols_interleaved);
|
||||||
UNUSED(blocklen);
|
UNUSED(blocklen);
|
||||||
|
|
||||||
#if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON)
|
#if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_DOTPROD)
|
||||||
if (ggml_cpu_has_neon() && ggml_cpu_has_dotprod()) {
|
|
||||||
const void * b_ptr = vx;
|
const void * b_ptr = vx;
|
||||||
const void * a_ptr = vy;
|
const void * a_ptr = vy;
|
||||||
float * res_ptr = s;
|
float * res_ptr = s;
|
||||||
@ -1101,7 +1094,6 @@ void ggml_gemm_q4_0_4x4_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", "x9", "x10", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28"
|
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", "x9", "x10", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28"
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
#endif // #if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON)
|
#endif // #if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON)
|
||||||
{
|
{
|
||||||
float sumf[4][4];
|
float sumf[4][4];
|
||||||
@ -1160,7 +1152,6 @@ void ggml_gemm_q4_0_4x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
UNUSED(blocklen);
|
UNUSED(blocklen);
|
||||||
|
|
||||||
#if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_MATMUL_INT8)
|
#if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_MATMUL_INT8)
|
||||||
if (ggml_cpu_has_neon() && ggml_cpu_has_matmul_int8()) {
|
|
||||||
const void * b_ptr = vx;
|
const void * b_ptr = vx;
|
||||||
const void * a_ptr = vy;
|
const void * a_ptr = vy;
|
||||||
float * res_ptr = s;
|
float * res_ptr = s;
|
||||||
@ -1557,7 +1548,6 @@ void ggml_gemm_q4_0_4x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", "x9", "x10", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28"
|
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", "x9", "x10", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28"
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
#endif // #if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_MATMUL_INT8)
|
#endif // #if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_MATMUL_INT8)
|
||||||
float sumf[4][4];
|
float sumf[4][4];
|
||||||
int sumi;
|
int sumi;
|
||||||
@ -1615,7 +1605,7 @@ void ggml_gemm_q4_0_8x8_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const vo
|
|||||||
|
|
||||||
#if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__)
|
#if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__)
|
||||||
#if defined(__ARM_FEATURE_SVE) && defined(__ARM_FEATURE_MATMUL_INT8)
|
#if defined(__ARM_FEATURE_SVE) && defined(__ARM_FEATURE_MATMUL_INT8)
|
||||||
if (ggml_cpu_has_sve() && ggml_cpu_has_matmul_int8() && ggml_cpu_get_sve_cnt() == QK8_0) {
|
if (ggml_cpu_get_sve_cnt() == QK8_0) {
|
||||||
const void * b_ptr = vx;
|
const void * b_ptr = vx;
|
||||||
const void * a_ptr = vy;
|
const void * a_ptr = vy;
|
||||||
float * res_ptr = s;
|
float * res_ptr = s;
|
||||||
@ -2083,7 +2073,6 @@ void ggml_gemm_iq4_nl_4x4_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
UNUSED(blocklen);
|
UNUSED(blocklen);
|
||||||
|
|
||||||
#if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_DOTPROD)
|
#if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON) && defined(__ARM_FEATURE_DOTPROD)
|
||||||
if (ggml_cpu_has_neon() && ggml_cpu_has_dotprod()) {
|
|
||||||
const int8x16_t kvalues = vld1q_s8(kvalues_iq4nl);
|
const int8x16_t kvalues = vld1q_s8(kvalues_iq4nl);
|
||||||
|
|
||||||
for (int y = 0; y < nr / 4; y++) {
|
for (int y = 0; y < nr / 4; y++) {
|
||||||
@ -2135,7 +2124,6 @@ void ggml_gemm_iq4_nl_4x4_q8_0(int n, float * GGML_RESTRICT s, size_t bs, const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
#endif // #if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON)
|
#endif // #if ! ((defined(_MSC_VER)) && ! defined(__clang__)) && defined(__aarch64__) && defined(__ARM_NEON)
|
||||||
{
|
{
|
||||||
float sumf[4][4];
|
float sumf[4][4];
|
||||||
|
@ -74,13 +74,8 @@
|
|||||||
|
|
||||||
#if defined(__ARM_ARCH)
|
#if defined(__ARM_ARCH)
|
||||||
struct ggml_arm_arch_features_type {
|
struct ggml_arm_arch_features_type {
|
||||||
int has_neon;
|
|
||||||
int has_dotprod;
|
|
||||||
int has_i8mm;
|
|
||||||
int has_sve;
|
|
||||||
int sve_cnt;
|
int sve_cnt;
|
||||||
int has_sme;
|
} ggml_arm_arch_features = { 0 };
|
||||||
} ggml_arm_arch_features = {-1, -1, -1, -1, 0, -1};
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -678,87 +673,15 @@ bool ggml_is_numa(void) {
|
|||||||
|
|
||||||
#if defined(__linux__) && defined(__aarch64__)
|
#if defined(__linux__) && defined(__aarch64__)
|
||||||
#include <sys/auxv.h>
|
#include <sys/auxv.h>
|
||||||
#elif defined(__APPLE__)
|
|
||||||
#include <sys/sysctl.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(HWCAP2_I8MM)
|
|
||||||
#define HWCAP2_I8MM (1 << 13)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(HWCAP2_SME)
|
|
||||||
#define HWCAP2_SME (1 << 23)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void ggml_init_arm_arch_features(void) {
|
static void ggml_init_arm_arch_features(void) {
|
||||||
#if defined(__linux__) && defined(__aarch64__)
|
#if defined(__linux__) && defined(__aarch64__) && defined(__ARM_FEATURE_SVE)
|
||||||
uint32_t hwcap = getauxval(AT_HWCAP);
|
|
||||||
uint32_t hwcap2 = getauxval(AT_HWCAP2);
|
|
||||||
|
|
||||||
ggml_arm_arch_features.has_neon = !!(hwcap & HWCAP_ASIMD);
|
|
||||||
ggml_arm_arch_features.has_dotprod = !!(hwcap & HWCAP_ASIMDDP);
|
|
||||||
ggml_arm_arch_features.has_i8mm = !!(hwcap2 & HWCAP2_I8MM);
|
|
||||||
ggml_arm_arch_features.has_sve = !!(hwcap & HWCAP_SVE);
|
|
||||||
ggml_arm_arch_features.has_sme = !!(hwcap2 & HWCAP2_SME);
|
|
||||||
|
|
||||||
#if defined(__ARM_FEATURE_SVE)
|
|
||||||
ggml_arm_arch_features.sve_cnt = PR_SVE_VL_LEN_MASK & prctl(PR_SVE_GET_VL);
|
ggml_arm_arch_features.sve_cnt = PR_SVE_VL_LEN_MASK & prctl(PR_SVE_GET_VL);
|
||||||
#endif
|
#endif
|
||||||
#elif defined(__APPLE__)
|
|
||||||
int oldp = 0;
|
|
||||||
size_t size = sizeof(oldp);
|
|
||||||
if (sysctlbyname("hw.optional.AdvSIMD", &oldp, &size, NULL, 0) != 0) {
|
|
||||||
oldp = 0;
|
|
||||||
}
|
|
||||||
ggml_arm_arch_features.has_neon = oldp;
|
|
||||||
|
|
||||||
if (sysctlbyname("hw.optional.arm.FEAT_DotProd", &oldp, &size, NULL, 0) != 0) {
|
|
||||||
oldp = 0;
|
|
||||||
}
|
|
||||||
ggml_arm_arch_features.has_dotprod = oldp;
|
|
||||||
|
|
||||||
if (sysctlbyname("hw.optional.arm.FEAT_I8MM", &oldp, &size, NULL, 0) != 0) {
|
|
||||||
oldp = 0;
|
|
||||||
}
|
|
||||||
ggml_arm_arch_features.has_i8mm = oldp;
|
|
||||||
|
|
||||||
if (sysctlbyname("hw.optional.arm.FEAT_SME", &oldp, &size, NULL, 0) != 0) {
|
|
||||||
oldp = 0;
|
|
||||||
}
|
|
||||||
ggml_arm_arch_features.has_sme = oldp;
|
|
||||||
|
|
||||||
ggml_arm_arch_features.has_sve = 0;
|
|
||||||
ggml_arm_arch_features.sve_cnt = 0;
|
|
||||||
#else
|
|
||||||
// Run-time CPU feature detection not implemented for this platform, fallback to compile time
|
|
||||||
#if defined(__ARM_NEON)
|
|
||||||
ggml_arm_arch_features.has_neon = 1;
|
|
||||||
#else
|
|
||||||
ggml_arm_arch_features.has_neon = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__ARM_FEATURE_MATMUL_INT8)
|
|
||||||
ggml_arm_arch_features.has_i8mm = 1;
|
|
||||||
#else
|
|
||||||
ggml_arm_arch_features.has_i8mm = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__ARM_FEATURE_SVE)
|
|
||||||
ggml_arm_arch_features.has_sve = 1;
|
|
||||||
ggml_arm_arch_features.sve_cnt = 16;
|
|
||||||
#else
|
|
||||||
ggml_arm_arch_features.has_sve = 0;
|
|
||||||
ggml_arm_arch_features.sve_cnt = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__ARM_FEATURE_SME) || defined(__ARM_FEATURE_SME2)
|
|
||||||
ggml_arm_arch_features.has_sme = 1;
|
|
||||||
#else
|
|
||||||
ggml_arm_arch_features.has_sme = 0;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
#endif // __ARM_ARCH
|
||||||
|
|
||||||
struct ggml_tensor * ggml_new_i32(struct ggml_context * ctx, int32_t value) {
|
struct ggml_tensor * ggml_new_i32(struct ggml_context * ctx, int32_t value) {
|
||||||
GGML_ASSERT(!ggml_get_no_alloc(ctx));
|
GGML_ASSERT(!ggml_get_no_alloc(ctx));
|
||||||
@ -3448,7 +3371,7 @@ int ggml_cpu_has_vxe(void) {
|
|||||||
|
|
||||||
int ggml_cpu_has_neon(void) {
|
int ggml_cpu_has_neon(void) {
|
||||||
#if defined(__ARM_ARCH) && defined(__ARM_NEON)
|
#if defined(__ARM_ARCH) && defined(__ARM_NEON)
|
||||||
return ggml_arm_arch_features.has_neon;
|
return 1;
|
||||||
#else
|
#else
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
@ -3456,7 +3379,7 @@ int ggml_cpu_has_neon(void) {
|
|||||||
|
|
||||||
int ggml_cpu_has_dotprod(void) {
|
int ggml_cpu_has_dotprod(void) {
|
||||||
#if defined(__ARM_ARCH) && defined(__ARM_FEATURE_DOTPROD)
|
#if defined(__ARM_ARCH) && defined(__ARM_FEATURE_DOTPROD)
|
||||||
return ggml_arm_arch_features.has_dotprod;
|
return 1;
|
||||||
#else
|
#else
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
@ -3464,7 +3387,7 @@ int ggml_cpu_has_dotprod(void) {
|
|||||||
|
|
||||||
int ggml_cpu_has_sve(void) {
|
int ggml_cpu_has_sve(void) {
|
||||||
#if defined(__ARM_ARCH) && defined(__ARM_FEATURE_SVE)
|
#if defined(__ARM_ARCH) && defined(__ARM_FEATURE_SVE)
|
||||||
return ggml_arm_arch_features.has_sve;
|
return 1;
|
||||||
#else
|
#else
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
@ -3472,7 +3395,7 @@ int ggml_cpu_has_sve(void) {
|
|||||||
|
|
||||||
int ggml_cpu_has_matmul_int8(void) {
|
int ggml_cpu_has_matmul_int8(void) {
|
||||||
#if defined(__ARM_ARCH) && defined(__ARM_FEATURE_MATMUL_INT8)
|
#if defined(__ARM_ARCH) && defined(__ARM_FEATURE_MATMUL_INT8)
|
||||||
return ggml_arm_arch_features.has_i8mm;
|
return 1;
|
||||||
#else
|
#else
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
@ -3488,7 +3411,7 @@ int ggml_cpu_get_sve_cnt(void) {
|
|||||||
|
|
||||||
int ggml_cpu_has_sme(void) {
|
int ggml_cpu_has_sme(void) {
|
||||||
#if defined(__ARM_ARCH) && defined(__ARM_FEATURE_SME)
|
#if defined(__ARM_ARCH) && defined(__ARM_FEATURE_SME)
|
||||||
return ggml_arm_arch_features.has_sme;
|
return 1;
|
||||||
#else
|
#else
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user