init {
Log.d(LOG_TAG, "Primary ABI: ${Build.SUPPORTED_ABIS[0]}")
var loadVfpv4 = false
+ var loadV8fp16 = false
if (isArmEabiV7a()) {
// armeabi-v7a needs runtime detection support
val cpuInfo = cpuInfo()
loadVfpv4 = true
}
}
+ } else if (isArmEabiV8a()) {
+ // ARMv8.2a needs runtime detection support
+ val cpuInfo = cpuInfo()
+ cpuInfo?.let {
+ Log.d(LOG_TAG, "CPU info: $cpuInfo")
+ if (cpuInfo.contains("fphp")) {
+ Log.d(LOG_TAG, "CPU supports fp16 arithmetic")
+ loadV8fp16 = true
+ }
+ }
}
if (loadVfpv4) {
Log.d(LOG_TAG, "Loading libwhisper_vfpv4.so")
System.loadLibrary("whisper_vfpv4")
+ } else if (loadV8fp16) {
+ Log.d(LOG_TAG, "Loading libwhisper_v8fp16_va.so")
+ System.loadLibrary("whisper_v8fp16_va")
} else {
Log.d(LOG_TAG, "Loading libwhisper.so")
System.loadLibrary("whisper")
return Build.SUPPORTED_ABIS[0].equals("armeabi-v7a")
}
+private fun isArmEabiV8a(): Boolean {
+ return Build.SUPPORTED_ABIS[0].equals("arm64-v8a")
+}
+
private fun cpuInfo(): String? {
return try {
File("/proc/cpuinfo").inputStream().bufferedReader().use {
# https://android.googlesource.com/platform/ndk/+/master/sources/android/cpufeatures/cpu-features.h
LOCAL_CFLAGS += -mfpu=neon-vfpv4
include $(BUILD_SHARED_LIBRARY)
-endif
\ No newline at end of file
+endif
+
+ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
+ include $(CLEAR_VARS)
+ LOCAL_MODULE := libwhisper_v8fp16_va
+ include $(LOCAL_PATH)/Whisper.mk
+ # Allow building NEON FMA code.
+ # https://android.googlesource.com/platform/ndk/+/master/sources/android/cpufeatures/cpu-features.h
+ LOCAL_CFLAGS += -march=armv8.2-a+fp16
+ include $(BUILD_SHARED_LIBRARY)
+endif
+