Implementation:Microsoft Onnxruntime Fp16Conversions Android
| Knowledge Sources | Description |
|---|---|
| Source File | java/src/main/android/ai/onnxruntime/platform/Fp16Conversions.java |
| Repository | Microsoft/onnxruntime |
Domains
- Machine Learning Runtime
- Floating Point Conversion
- Android Platform
Overview
Fp16Conversions (Android variant) is a final utility class providing conversions between IEEE fp16, bfloat16, and fp32 formats on the Android platform. Unlike the JVM variant, the Android version directly calls the MLAS-ported conversion methods without attempting to use Java 20+ Float.float16ToFloat/Float.floatToFloat16 intrinsics, since Android does not support those methods.
Description
The class provides buffer-level and scalar-level conversions:
Buffer conversions:
convertFloatBufferToFp16Buffer(FloatBuffer): Rounds fp32 values to fp16 (stored as shorts).convertFp16BufferToFloatBuffer(ShortBuffer): Casts fp16 shorts to fp32 floats.convertFloatBufferToBf16Buffer(FloatBuffer): Rounds fp32 values to bf16 (stored as shorts).convertBf16BufferToFloatBuffer(ShortBuffer): Casts bf16 shorts to fp32 floats.
Scalar conversions:
fp16ToFloat(short)/floatToFp16(float): Aliases to the MLAS conversion methods.mlasFp16ToFloat(short): Port of MLAS_Half2Float, handles normal, subnormal, Inf, and NaN.mlasFloatToFp16(float): Port of MLAS_Float2Half with round-to-nearest-even.bf16ToFloat(short): Simple left-shift by 16 bits.floatToBf16(float): Truncation with round-to-nearest-even bias.
All buffer methods allocate new direct buffers and respect input position/limit.
Code Reference
Source Location
// File: java/src/main/android/ai/onnxruntime/platform/Fp16Conversions.java
// Package: ai.onnxruntime.platform
Signature
public final class Fp16Conversions {
public static ShortBuffer convertFloatBufferToFp16Buffer(FloatBuffer buf);
public static FloatBuffer convertFp16BufferToFloatBuffer(ShortBuffer buf);
public static ShortBuffer convertFloatBufferToBf16Buffer(FloatBuffer buf);
public static FloatBuffer convertBf16BufferToFloatBuffer(ShortBuffer buf);
public static float fp16ToFloat(short input);
public static short floatToFp16(float input);
public static float mlasFp16ToFloat(short input);
public static short mlasFloatToFp16(float input);
public static float bf16ToFloat(short input);
public static short floatToBf16(float input);
}
Import
import ai.onnxruntime.platform.Fp16Conversions;
I/O Contract
Inputs
| Name | Type | Description |
|---|---|---|
| buf | FloatBuffer or ShortBuffer | Buffer of source values to convert |
| input | float or short | Single value to convert |
Outputs
| Name | Type | Description |
|---|---|---|
| ShortBuffer | ShortBuffer | Direct buffer containing fp16/bf16 values as shorts |
| FloatBuffer | FloatBuffer | Direct buffer containing fp32 values |
| float | float | Single converted fp32 value |
| short | short | Single converted fp16/bf16 value |
Usage Examples
import ai.onnxruntime.platform.Fp16Conversions;
import java.nio.*;
// Convert fp32 buffer to fp16
FloatBuffer floatBuf = FloatBuffer.wrap(new float[]{1.0f, 0.5f, -3.14f});
ShortBuffer fp16Buf = Fp16Conversions.convertFloatBufferToFp16Buffer(floatBuf);
// Convert back to fp32
FloatBuffer roundTrip = Fp16Conversions.convertFp16BufferToFloatBuffer(fp16Buf);
// Scalar conversions
short fp16Val = Fp16Conversions.floatToFp16(3.14f);
float fp32Val = Fp16Conversions.fp16ToFloat(fp16Val);
// BF16 conversions
short bf16Val = Fp16Conversions.floatToBf16(2.71828f);
float fromBf16 = Fp16Conversions.bf16ToFloat(bf16Val);
Related Pages
- Fp16Conversions.java (JVM) - JVM variant with Java 20+ intrinsics support
- OnnxTensor.java - Uses Fp16Conversions for fp16/bf16 tensor value extraction
- OnnxJavaType.java - FLOAT16 and BFLOAT16 type constants