FP16 gemm on cpu not implemented! GPU架構中的半精度與單精度計算
FP16 gemm on cpu not implemented! Stack trace returned 10 entries:
(0)/usr/local/lib/python2.7/dist-packages/mxnet-1.3.0-py2.7.egg/mxnet/libmxnet.so(dmlc::StackTrace[abi:cxx11]()+0x1bc) [0x7fe33d02da0c] [bt]
(1)/usr/local/lib/python2.7/dist-packages/mxnet-1.3.0-py2.7.egg/mxnet/libmxnet.so(dmlc::LogMessageFatal::~LogMessageFatal()+0x28) [0x7fe33d02ed88] [bt]
(2)/usr/local/lib/python2.7/dist-packages/mxnet-1.3.0-py2.7.egg/mxnet/libmxnet.so(mxnet::op::ConvolutionOp<mshadow::cpu, mshadow::half::half_t>::Forward(mxnet::OpContext const&, std::vector<mxnet::TBlob, std::allocator<mxnet::TBlob> > const&, std::vector<mxnet::OpReqType, std::allocator<mxnet::OpReqType> > const&, std::vector<mxnet::TBlob, std::allocator<mxnet::TBlob> > const&)+0x186e) [0x7fe33f75f2ee] [bt]
GPU架構中的半精度fp16與單精度fp32計算
CUDA7.5開始,支援16位浮點數的儲存和計算,添加了half
和half2
兩種資料型別,並內建了用來操作它們的函式。16位“半精度”浮點型別在應用程式中很有用,這些應用程式可以處理更大的資料集,也可以通過儲存和操作更低精度的資料來獲得性能。例如對一些規模比較大的神經網路模型來說,它們可能會受限於有限的GPU儲存;一些訊號處理核心(signal processing kernels 如FFTs)受限於儲存的頻寬。
許多應用都會得益於使用半精度來儲存資料,然後用32位的單精度來處理這些資料。Pascal架構的GPU將會全面支援這種“混合精度”的計算,使用FP16計算將會獲得比FP32和FP64更高的吞吐量。
CUDA7.5提供了3個FP16的特性
符號:1 bit
指數位:5 bits
精度位:10 bits
半精度數的範圍大約是5.96×10^-8~6.55×10^4。half2結構在一個32位字裡儲存兩個half值: