set(GGML_INTERNAL_${feat} OFF)
endforeach()
+ foreach (feat ${ARGN})
+ set(GGML_INTERNAL_${feat} ON)
+ endforeach()
+ elseif (GGML_SYSTEM_ARCH STREQUAL "riscv64")
+ foreach (feat RVV)
+ set(GGML_INTERNAL_${feat} OFF)
+ endforeach()
+
foreach (feat ${ARGN})
set(GGML_INTERNAL_${feat} ON)
endforeach()
else()
message(FATAL_ERROR "Unsupported s390x target OS: ${CMAKE_SYSTEM_NAME}")
endif()
+ elseif (GGML_SYSTEM_ARCH STREQUAL "riscv64")
+ if (CMAKE_SYSTEM_NAME MATCHES "Linux")
+ ggml_add_cpu_backend_variant(riscv64_0)
+ ggml_add_cpu_backend_variant(riscv64_v RVV)
+ else()
+ message(FATAL_ERROR "Unsupported RISC-V target OS: ${CMAKE_SYSTEM_NAME}")
+ endif()
else()
message(FATAL_ERROR "GGML_CPU_ALL_VARIANTS not yet supported with ${GGML_SYSTEM_ARCH} on ${CMAKE_SYSTEM_NAME}")
endif()
ggml-cpu/spacemit/ime_kernels.h
)
endif()
- set(MARCH_STR "rv64gc")
- if (GGML_RV_ZFH)
- string(APPEND MARCH_STR "_zfh")
- endif()
- if (GGML_XTHEADVECTOR)
- string(APPEND MARCH_STR "_xtheadvector")
- elseif (GGML_RVV)
- string(APPEND MARCH_STR "_v")
- if (GGML_RV_ZVFH)
- string(APPEND MARCH_STR "_zvfh")
+ if(NOT GGML_CPU_ALL_VARIANTS)
+ set(MARCH_STR "rv64gc")
+ if (GGML_RV_ZFH)
+ string(APPEND MARCH_STR "_zfh")
endif()
+ if (GGML_XTHEADVECTOR)
+ string(APPEND MARCH_STR "_xtheadvector")
+ elseif (GGML_RVV)
+ string(APPEND MARCH_STR "_v")
+ if (GGML_RV_ZVFH)
+ string(APPEND MARCH_STR "_zvfh")
+ endif()
+ endif()
+ if (GGML_RV_ZICBOP)
+ string(APPEND MARCH_STR "_zicbop")
+ endif()
+ list(APPEND ARCH_FLAGS "-march=${MARCH_STR}" -mabi=lp64d)
+ else()
+ # Begin with the lowest baseline
+ set(ARCH_DEFINITIONS "")
+
+ if (GGML_INTERNAL_RVV)
+ message(STATUS "RVV enabled")
+ list(APPEND ARCH_DEFINITIONS GGML_USE_RVV)
+ list(APPEND ARCH_FLAGS -march=rv64gc_v -mabi=lp64d)
+ endif()
+
+ ggml_add_cpu_backend_features(${GGML_CPU_NAME} riscv ${ARCH_DEFINITIONS})
endif()
- if (GGML_RV_ZICBOP)
- string(APPEND MARCH_STR "_zicbop")
- endif()
- list(APPEND ARCH_FLAGS "-march=${MARCH_STR}" -mabi=lp64d)
elseif (GGML_SYSTEM_ARCH STREQUAL "s390x")
message(STATUS "s390x detected")
list(APPEND GGML_CPU_SOURCES
--- /dev/null
+#include "ggml-backend-impl.h"
+
+#if defined(__riscv) && __riscv_xlen == 64
+#include <sys/auxv.h>
+
+//https://github.com/torvalds/linux/blob/master/arch/riscv/include/uapi/asm/hwcap.h#L24
+#ifndef COMPAT_HWCAP_ISA_V
+#define COMPAT_HWCAP_ISA_V (1 << ('V' - 'A'))
+#endif
+
+struct riscv64_features {
+ bool has_rvv = false;
+
+ riscv64_features() {
+ uint32_t hwcap = getauxval(AT_HWCAP);
+
+ has_rvv = !!(hwcap & COMPAT_HWCAP_ISA_V);
+ }
+};
+
+static int ggml_backend_cpu_riscv64_score() {
+ int score = 1;
+ riscv64_features rf;
+
+#ifdef GGML_USE_RVV
+ if (!rf.has_rvv) { return 0; }
+ score += 1 << 1;
+#endif
+
+ return score;
+}
+
+GGML_BACKEND_DL_SCORE_IMPL(ggml_backend_cpu_riscv64_score)
+
+#endif // __riscv && __riscv_xlen == 64