lib: expose Arm features
This commit is contained in:
parent
c5058366dc
commit
21e61281fa
|
|
@ -0,0 +1,90 @@
|
||||||
|
package android.llama.cpp
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents an ARM CPU feature with its metadata.
|
||||||
|
*/
|
||||||
|
data class ArmFeature(
|
||||||
|
val name: String,
|
||||||
|
val displayName: String,
|
||||||
|
val description: String,
|
||||||
|
val armDocUrl: String
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper class to map LLamaTier to supported ARM features.
|
||||||
|
*/
|
||||||
|
object ArmFeaturesMapper {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UI display item combining feature info with support status.
|
||||||
|
*/
|
||||||
|
data class DisplayItem(
|
||||||
|
val feature: ArmFeature,
|
||||||
|
val isSupported: Boolean
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All ARM features supported by the library, in order of introduction.
|
||||||
|
*
|
||||||
|
* TODO-han.yin: fix the broken hyperlinks above!
|
||||||
|
*/
|
||||||
|
val allFeatures = listOf(
|
||||||
|
ArmFeature(
|
||||||
|
name = "ASIMD",
|
||||||
|
displayName = "ASIMD",
|
||||||
|
description = "Advanced SIMD (NEON) - baseline vectorization",
|
||||||
|
armDocUrl = "https://developer.arm.com/architectures/instruction-sets/simd-isas/neon"
|
||||||
|
),
|
||||||
|
ArmFeature(
|
||||||
|
name = "DOTPROD",
|
||||||
|
displayName = "DOTPROD",
|
||||||
|
description = "Dot Product instructions for neural networks",
|
||||||
|
armDocUrl = "https://developer.arm.com/architectures/instruction-sets/intrinsics/dotprod"
|
||||||
|
),
|
||||||
|
ArmFeature(
|
||||||
|
name = "I8MM",
|
||||||
|
displayName = "I8MM",
|
||||||
|
description = "Integer 8-bit Matrix Multiplication",
|
||||||
|
armDocUrl = "https://developer.arm.com/documentation/102107/latest/Matrix-multiplication-instructions"
|
||||||
|
),
|
||||||
|
ArmFeature(
|
||||||
|
name = "SVE",
|
||||||
|
displayName = "SVE",
|
||||||
|
description = "Scalable Vector Extension",
|
||||||
|
armDocUrl = "https://developer.arm.com/architectures/instruction-sets/simd-isas/sve"
|
||||||
|
),
|
||||||
|
ArmFeature(
|
||||||
|
name = "SME",
|
||||||
|
displayName = "SME",
|
||||||
|
description = "Scalable Matrix Extension",
|
||||||
|
armDocUrl = "https://developer.arm.com/architectures/instruction-sets/simd-isas/sme"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps a LLamaTier to its supported ARM features.
|
||||||
|
* Returns a list of booleans where each index corresponds to allFeatures.
|
||||||
|
*/
|
||||||
|
fun getSupportedFeatures(tier: LLamaTier?): List<Boolean> =
|
||||||
|
when (tier) {
|
||||||
|
LLamaTier.T0 -> listOf(true, false, false, false, false) // ASIMD only
|
||||||
|
LLamaTier.T1 -> listOf(true, true, false, false, false) // ASIMD + DOTPROD
|
||||||
|
LLamaTier.T2 -> listOf(true, true, true, false, false) // ASIMD + DOTPROD + I8MM
|
||||||
|
LLamaTier.T3 -> listOf(true, true, true, true, false) // ASIMD + DOTPROD + I8MM + SVE
|
||||||
|
// TODO-han.yin: implement T4 once obtaining an Android device with SME!
|
||||||
|
null -> listOf(false, false, false, false, false) // No tier detected
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the feature support data for UI display.
|
||||||
|
*/
|
||||||
|
fun getFeatureDisplayData(tier: LLamaTier?): List<DisplayItem> =
|
||||||
|
getSupportedFeatures(tier).let { flags ->
|
||||||
|
allFeatures.mapIndexed { index, feature ->
|
||||||
|
DisplayItem(
|
||||||
|
feature = feature,
|
||||||
|
isSupported = flags.getOrElse(index) { false }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue