Half Precision Code Generation Support - MATLAB & Simulink (original) (raw)
Main Content
To assign a half-precision data type to a number or variable, use the half (Fixed-Point Designer) constructor. A half-precision data type occupies 16 bits of memory, but its floating-point representation enables it to handle wider dynamic ranges than integer or fixed-point data types of the same size. For more information, see Floating-Point Numbers (Fixed-Point Designer).
A subset of MATLAB® functions are supported for use with half-precision inputs. Additionally, some functions support code generation with half-precision data types. C and C++ code generation requires MATLAB Coder™. CUDA® code generation for NVIDIA® GPUs requires GPU Coder™. Supported functions appear in alphabetical order in the following table. MATLAB System object™ supports half-precision data type and MATLAB System (Simulink) block supports half-precision data type with real values. For general information regarding code generation with half precision, see half (Fixed-Point Designer).
Function | MATLAB Simulation Support | C/C++ Code Generation Support | GPU Code Generation Support |
---|---|---|---|
abs | ✔ | ✔ | ✔ |
acos | ✔ | ✔ | ✔ |
acosh | ✔ | ✔ | ✔ |
activations (Deep Learning Toolbox) | ✔ | ✔Half inputs are cast to single precision and computations are performed in single precision. | ✔Half inputs are cast to single precision and computations are performed in single precision. To perform computations in half, set the library target to 'tensorrt' and set the data type to 'FP16' in coder.DeepLearningConfig. |
all | ✔ | ✔ | ✔ |
allfinite | ✔ | ✔ | ✔ |
and, & | ✔ | ✔ | ✔ |
Short-Circuit AND | ✔ | ✔ | ✔ |
any | ✔ | ✔ | ✔ |
anynan | ✔ | ✔ | ✔ |
area | ✔ | ||
asin | ✔ | ✔ | ✔ |
asinh | ✔ | ✔ | ✔ |
atan | ✔ | ✔ | ✔ |
atan2 | ✔ | ✔ | ✔ |
atanh | ✔ | ✔ | ✔ |
bar | ✔ | ||
barh | ✔ | ||
cast | ✔Supported syntax:cast(_,'half')cast(_,'like',p) | ✔Supported syntax:cast(_,'half')cast(_,'like',p) | ✔Supported syntax:cast(_,'half')cast(_,'like',p) |
cat | ✔ | ✔ Dimension argument must be a constant.Dimension argument cannot be half precision. | ✔ Dimension argument must be a constant.Dimension argument cannot be half precision. |
ceil | ✔ | ✔ | ✔ |
cell | ✔ | ✔ | ✔ |
chol | ✔ | ||
circshift | ✔ | ✔ | ✔ |
classify (Deep Learning Toolbox) | ✔ | ✔Half inputs are cast to single precision and computations are performed in single precision. | ✔Half inputs are cast to single precision and computations are performed in single precision. To perform computations in half, set the library target to 'tensorrt' and set the data type to 'FP16' in coder.DeepLearningConfig. |
coder.ceval (Simulink) | ✔ | ✔ | |
colon, : | ✔ | ✔ | ✔ |
complex | ✔ | ✔ | |
conj | ✔ | ✔ | ✔ |
conv | ✔ | ✔ | ✔ |
conv2 | ✔ | ✔ | ✔ |
cos | ✔ | ✔ | ✔ |
cosh | ✔ | ✔ | ✔ |
cospi | ✔ | ✔ | ✔ |
ctranspose | ✔ | ✔ | ✔ |
cumsum | ✔ | ||
dot | ✔ | ||
double | ✔ | ✔ | ✔ |
empty | ✔ | ||
eps | ✔Supported syntax:eps('half')eps(half(1))eps('like',half(1)) | ✔eps(half(1)) | ✔eps(half(1)) |
eq, == | ✔ | ✔ | ✔ |
exp | ✔ | ✔ | ✔ |
expm1 | ✔ | ✔ | ✔ |
eye | ✔Supported syntax:eye(_,'half')eye(_,'like',p) | ✔Supported syntax:eye(_,'half')eye(_,'like',p) where p is half precision. Other input arguments cannot be half precision. | ✔Supported syntax:eye(_,'half')eye(_,'like',p) where p is half precision. Other input arguments cannot be half precision. |
fft | ✔ | ✔ | |
fft2 | ✔ | ✔ | |
fftn | ✔ | ✔ | |
fftshift | ✔ | ✔ | ✔ |
fix | ✔ | ✔ | ✔ |
fixed.interp1 (Fixed-Point Designer) | ✔ | ✔ | |
fixed.interp2 (Fixed-Point Designer) | ✔ | ✔ | |
fixed.interp3 (Fixed-Point Designer) | ✔ | ✔ | |
fixed.interpn (Fixed-Point Designer) | ✔ | ✔ | |
flintmax | ✔Supported syntax:flintmax('half')flintmax('like',half(1)) | ||
flip | ✔ | ✔Dimension argument cannot be half precision. | ✔Dimension argument cannot be half precision. |
fliplr | ✔ | ✔ | ✔ |
flipud | ✔ | ✔ | ✔ |
floor | ✔ | ✔ | ✔ |
fma (Fixed-Point Designer) | ✔Complex half-precision inputs are not supported. | ✔Complex half-precision inputs are not supported. | ✔Complex half-precision inputs are not supported. |
fplot | ✔ | ||
ge, >= | ✔ | ✔ | ✔ |
gt, > | ✔ | ✔ | ✔ |
half (Fixed-Point Designer) | ✔ | ✔ | ✔ |
horzcat | ✔ | ✔ | ✔ |
hypot | ✔ | ✔ | ✔ |
ifft | ✔ | ✔ | |
ifft2 | ✔ | ✔ | |
ifftn | ✔ | ✔ | |
ifftshift | ✔ | ✔ | ✔ |
imag | ✔ | ✔ | |
Inf | ✔Supported syntax:Inf(_,'half')Inf(_,'like',p) | ✔Supported syntax:Inf(_,'half')Inf(_,'like',p) | ✔Supported syntax:Inf(_,'half')Inf(_,'like',p) |
int16 | ✔ | ✔ | ✔ |
int32 | ✔ | ✔ | ✔ |
int64 | ✔ | ✔ | ✔ |
int8 | ✔ | ✔ | ✔ |
isa | ✔ | ✔ | ✔ |
iscolumn | ✔ | ✔ | ✔ |
isempty | ✔ | ✔ | ✔ |
isequal | ✔ | ✔ | ✔ |
isequaln | ✔ | ✔ | ✔ |
isfinite | ✔ | ✔ | ✔ |
isfloat (Fixed-Point Designer) | ✔ | ✔ | ✔ |
isinf | ✔ | ✔ | ✔ |
isinteger | ✔ | ✔ | ✔ |
islogical | ✔ | ✔ | ✔ |
ismatrix | ✔ | ✔ | ✔ |
isnan | ✔ | ✔ | ✔ |
isnumeric | ✔ | ✔ | ✔ |
isobject | ✔Returns true with half-precision input. | ✔Returns false with half-precision input. | ✔Returns false with half-precision input. |
isreal | ✔ | ✔ | ✔ |
isrow | ✔ | ✔ | ✔ |
isscalar | ✔ | ✔ | ✔ |
issorted | ✔ | ||
isvector | ✔ | ✔ | ✔ |
ldivide | ✔ | ✔ | ✔ |
le, <= | ✔ | ✔ | ✔ |
length | ✔ | ✔ | ✔ |
line | ✔ | ||
log | ✔ | ✔ | ✔ |
log10 | ✔ | ✔ | ✔ |
log1p | ✔ | ✔ | ✔ |
log2 | ✔ | ✔Two output syntax is not supported. | ✔Two output syntax is not supported. |
logical | ✔ | ✔ | ✔ |
lt, < | ✔ | ✔ | ✔ |
lu | ✔ | ||
max | ✔ | ✔ | ✔ |
mean | ✔ | ✔ | ✔ |
min | ✔ | ✔ | ✔ |
minus, - | ✔ | ✔ | ✔ |
mldivide, \ | ✔Left-hand side must be scalar | ||
mod | ✔ | ✔ | ✔ |
mrdivide, / | ✔Right-hand side must be scalar | ✔Right-hand side must be scalar | ✔Right-hand side must be scalar |
mtimes, * | ✔ | ✔ | ✔For GPU Code generation, you can perform half-precision matrix multiplication with real inputs. |
NaN | ✔Supported syntax:NaN(_,'half')NaN(_,'like',p) | ✔Supported syntax:NaN(_,'half')NaN(_,'like',p) | ✔Supported syntax:NaN(_,'half')NaN(_,'like',p) |
ndims | ✔ | ✔ | ✔ |
ne, ~= | ✔ | ✔ | ✔ |
not | ✔ | ✔ | ✔ |
numel | ✔ | ✔ | ✔ |
ones | ✔Supported syntax:ones(_,'half')ones(_,'like',p) | ✔Supported syntax:ones(_,'half')ones(_,'like',p) | ✔Supported syntax:ones(_,'half')ones(_,'like',p) |
or, | | ✔ | ✔ | |
Short-Circuit OR | ✔ | ✔ | ✔ |
permute | ✔ | ✔ | ✔ |
plot | ✔ | ||
plot3 | ✔ | ||
plotmatrix | ✔ | ||
plus, + | ✔ | ✔ | ✔ |
pow10 (Fixed-Point Designer) | ✔ | ✔ | ✔ |
pow2 | ✔ | ✔ | ✔ |
power, .^ | ✔ | ✔ | ✔ |
predict (Deep Learning Toolbox) | ✔ | ✔Half inputs are cast to single precision and computations are performed in single precision. | ✔Half inputs are cast to single precision and computations are performed in single precision. To perform computations in half, set the library target to 'tensorrt' and set the data type to 'FP16' in coder.DeepLearningConfig. |
predictAndUpdateState (Deep Learning Toolbox) | ✔ | ✔Half inputs are cast to single precision and computations are performed in single precision. | ✔Half inputs are cast to single precision and computations are performed in single precision. To perform computations in half, set the library target to 'tensorrt' and set the data type to 'FP16' in coder.DeepLearningConfig. |
prod | ✔Half inputs are cast to single precision and computations are performed in single precision. As a result, saturation behavior differs between single and half inputs:maxhalf = half.realmax; isequal(prod([maxhalf 2 0.5]), maxhalf)ans = logical 1maxsingle = realmax('single'); isequal(prod([maxsingle 2 0.5]), maxsingle)ans = logical 0 | ✔ | ✔ |
rdivide | ✔ | ✔ | ✔ |
real | ✔ | ✔ | ✔ |
realmax | ✔Supported syntax:realmax('half')realmax('like',half(1)) | ||
realmin | ✔Supported syntax:realmin('half')realmin('like',half(1)) | ||
rem | ✔ | ✔ | ✔ |
repelem | ✔ | ✔ | ✔ |
repmat | ✔ | ✔Dimension argument cannot be half precision. | ✔Dimension argument cannot be half precision. |
reshape | ✔ | ✔Dimension argument cannot be half precision. | ✔Dimension argument cannot be half precision. |
rgbplot | ✔ | ||
round | ✔Only one input supported | ✔Only one input supported | ✔Only one input supported |
rsqrt (Fixed-Point Designer) | ✔Complex half-precision inputs are not supported | ||
scatter | ✔ | ||
scatter3 | ✔ | ||
sign | ✔ | ✔ | ✔ |
sin | ✔ | ✔ | ✔ |
single | ✔ | ✔ | ✔ |
sinh | ✔ | ✔ | ✔ |
sinpi | ✔ | ✔ | ✔ |
size | ✔ | ✔ | ✔ |
sort | ✔ | ||
sqrt | ✔ | ✔ | ✔ |
squeeze | ✔ | ✔ | ✔ |
storedInteger (Fixed-Point Designer) | ✔ | ||
sum | ✔Half inputs are cast to single precision and computations are performed in single precision. As a result, saturation behavior differs between single and half inputs:maxhalfint = half.flintmax; isequal(sum([maxhalfint, 1, -1]), maxhalfint)ans = logical 1maxsingleint = flintmax('single'); isequal(sum([maxsingleint, 1, -1]), maxsingleint)ans = logical 0 | ✔ | ✔ |
tan | ✔ | ✔ | ✔ |
tanh | ✔ | ✔ | ✔ |
times, .* | ✔ | ✔ | ✔ |
transpose | ✔ | ✔ | ✔ |
typecast | ✔ | ||
uint16 | ✔ | ✔ | ✔ |
uint32 | ✔ | ✔ | ✔ |
uint64 | ✔ | ✔ | ✔ |
uint8 | ✔ | ✔ | ✔ |
uminus | ✔ | ✔ | ✔ |
uplus | ✔ | ✔ | ✔ |
vertcat | ✔ | ✔ | ✔ |
xlim | ✔ | ||
ylim | ✔ | ||
zeros | ✔Supported syntax:zeros(_,'half')zeros(_,'like',p) | ✔Supported syntax:zeros(_,'half')zeros(_,'like',p) | ✔Supported syntax:zeros(_,'half')zeros(_,'like',p) |
zlim | ✔ |
See Also
Related Topics
- Floating-Point Numbers (Fixed-Point Designer)
- What Is Half Precision? (Fixed-Point Designer)
- Generate Code for Sobel Edge Detection That Uses Half-Precision Data Type