Implementation:Microsoft Onnxruntime Fp16Conversions JVM
| Knowledge Sources | Description |
|---|---|
| Source File | java/src/main/jvm/ai/onnxruntime/platform/Fp16Conversions.java |
| Repository | Microsoft/onnxruntime |
Domains
- Machine Learning Runtime
- Floating Point Conversion
- JVM Platform
Overview
Fp16Conversions (JVM variant) is a final utility class providing conversions between IEEE fp16, bfloat16, and fp32 formats on standard JVM platforms. Unlike the Android variant, this version uses MethodHandle lookup to detect and use Java 20+ Float.float16ToFloat/Float.floatToFloat16 intrinsics at runtime. When running on Java 19 or earlier, it falls back to the MLAS-ported software conversion methods.
Description
The class uses a static initializer to probe for Java 20+ methods via MethodHandles.Lookup:
- If
Float.float16ToFloatandFloat.floatToFloat16are found, they are bound toMethodHandlefields for potential SIMD acceleration. - Otherwise, the MLAS-ported methods (
mlasFp16ToFloat,mlasFloatToFp16) are bound.
Buffer conversions:
convertFloatBufferToFp16Buffer(FloatBuffer): Rounds fp32 to fp16.convertFp16BufferToFloatBuffer(ShortBuffer): Casts fp16 to fp32.convertFloatBufferToBf16Buffer(FloatBuffer): Rounds fp32 to bf16.convertBf16BufferToFloatBuffer(ShortBuffer): Casts bf16 to fp32.
Scalar conversions:
fp16ToFloat(short)/floatToFp16(float): Invoke the detected MethodHandle (Java 20+ intrinsics or MLAS fallback).mlasFp16ToFloat(short)/mlasFloatToFp16(float): Software implementations ported from MLAS.bf16ToFloat(short)/floatToBf16(float): Direct bit manipulation.
Code Reference
Source Location
// File: java/src/main/jvm/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.*;
// On Java 20+, these use hardware-accelerated conversions
short fp16Val = Fp16Conversions.floatToFp16(3.14f);
float fp32Val = Fp16Conversions.fp16ToFloat(fp16Val);
// Buffer-level conversion (creates new direct buffers)
FloatBuffer floatBuf = FloatBuffer.wrap(new float[]{1.0f, 2.0f, 3.0f});
ShortBuffer fp16Buf = Fp16Conversions.convertFloatBufferToFp16Buffer(floatBuf);
// BF16 round-trip
short bf16 = Fp16Conversions.floatToBf16(2.71828f);
float fromBf16 = Fp16Conversions.bf16ToFloat(bf16);
// Force MLAS software conversion (always available)
float mlasResult = Fp16Conversions.mlasFp16ToFloat(fp16Val);
Related Pages
- Fp16Conversions.java (Android) - Android variant without Java 20+ intrinsics
- OnnxTensor.java - Uses Fp16Conversions for fp16/bf16 tensor value extraction
- OnnxJavaType.java - FLOAT16 and BFLOAT16 type constants