More Related Content
Similar to 浮動小数点(IEEE754)を圧縮したい@dsirnlp#4 (20)
More from Takeshi Yamamuro (20)
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
- 2. 本日の概要
• 背景と動機
• 浮動小数点(IEEE754)表現に関して
– IEEE754に関する雑談
• 圧縮方法の概要と設計
• 簡単な性能評価
• 参考
2
- 5. 浮動小数点列圧縮の応用
• Ex.)
Amazon
RedshiN
– サポートしている型*
• SMALLINT,
INTEGER,
BIGINT,
DECIMAL,
REAL,
DOUBLE
PRECISION,
BOOLEAN,
CHAR,
VARCHAR,
DATE,
TIMESTAMP
– サポートしている圧縮形式
• BYTEDICT,
DELTA,
DELTA32K,
MOSTLY8,
MOSTLY16,
MOSTLY32,
RAW,
RUNLENGTH,
TEXT255,
TEXT32K
• READ/DOUBLE
PRECISIONに対応した圧縮形式がない?
5
*http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html
- 6. 浮動小数点表現の形式
• 浮動小数点表現の様々な形式*
IEEE754
最も有名な標準規格
符号/指数部/仮数部が単精度で1/8/23bit、倍精度で1/11/52bit
80bit拡張倍精度
x87内部で利用されている
指数部15bit、仮数部64bitで表現
正規化された仮数部の最上位bitは省略されない
IBM形式
IBM
System360等のMFで主に使われた形式
指数部が2ではなく16のべき乗
単精度で指数部7bit、仮数部24bitで表現
6
*Wikipeadia: http://ja.wikipedia.org/wiki/浮動小数点
- 7. 余談1
最近のx64のIEEE754の計算
• デフォルトではSSEを利用した浮動小数点計算
7
例: double c = 1.0 + 2.0;
# gcc -S -masm=intel -o - xxx.cc
movabs rax, 4607182418800017408
mov QWORD PTR [rbp-24], rax
movabs rax, 4611686018427387904
mov QWORD PTR [rbp-16], rax
movsd xmm0, QWORD PTR [rbp-24]
addsd xmm0, QWORD PTR [rbp-16]
IEEE754形式
- 8. 余談1
最近のx64のIEEE754の計算
• ‘-‐mfpmath=387’でx87の80bit拡張倍精度計算
8
例: double c = 1.0 + 2.0;
# gcc -S -mfpmath=387 -masm=intel -o - xxx.cc
movabs rax, 4607182418800017408
mov QWORD PTR [rbp-24], rax
movabs rax, 4611686018427387904
mov QWORD PTR [rbp-16], rax
fld QWORD PTR [rbp-24]
fadd QWORD PTR [rbp-16]
fstp QWORD PTR [rbp-8]
FPUスタックモデルによる演算
- 10. 余談2
IEEE754の整数隣接性
• Ex.)
浮動小数点列の並び替えの改善
– 順序等価な整数に変換して処理
– 浮動小数点比較ucmisdと整数比較cmpのコスト[6]
• ucomisd:
latency
6-‐7,
throughput
2
• cmp:
latency
1,
throughput
1
10
Radix Tricks
uint32_t flipFloat(uint32_t ieee754) {
uint32_t mask = (ieee754 31) | 0x80000000;
return ieee754 ^ mask;
}
CUDAのRadixSortのサンプル実装で利用
- http://docs.nvidia.com/cuda/cuda-samples/index.html
- 13. 圧縮方法の概要と設計
• ‘09年に提案されているFPCの概要を紹介
• FPCの概要
– 数値解析処理で発生する浮動小数点列を圧縮
• 天気、気候、地震等の予測処理など
– 圧縮率よりもスループット(復元速度)を重視した設計
– 事前与えられたPredicatorによる予測値と実値との差分を
記録することで圧縮
• FCMとDFCMの2種類のPredicatorを用いて推定
13
- 14. Predicator(FCMとDFCM)の設計
• FCMの概要
– 過去の浮動小数点列からHash
Tableを構築
– 直近の値(Hash値)に対応したHash
Tableのエントリを予想値に
14
unsigned long long true_value;
unsigned long long fcm_prediction;
unsigned long long fcm[table_size];
fcm_prediction = fcm[fcm_hash];
fcm[fcm_hash] = true_value;
fcm_hash = ((fcm_hash 6) ^ (true_value 48)) (table_size - 1);
val_fcm = true_value ^ fcm_prediction;
- 15. Predicator(FCMとDFCM)の設計
• FCMの概要
– 過去の浮動小数点列からHash
Tableを構築
– 直近の値(Hash値)に対応したHash
Tableのエントリを予想値に
15
unsigned long long true_value;
unsigned long long fcm_prediction;
unsigned long long fcm[table_size];
fcm_prediction = fcm[fcm_hash];
fcm[fcm_hash] = true_value;
fcm_hash = ((fcm_hash 6) ^ (true_value 48)) (table_size - 1);
val_fcm = true_value ^ fcm_prediction;
IEEE754形式の整数値
過去の系列から構築するHash Table
※table_sizeは入力パラメータ
- 16. Predicator(FCMとDFCM)の設計
• FCMの概要
– 過去の浮動小数点列からHash
Tableを構築
– 直近の値(Hash値)に対応したHash
Tableのエントリを予想値に
16
unsigned long long true_value;
unsigned long long fcm_prediction;
unsigned long long fcm[table_size];
fcm_prediction = fcm[fcm_hash];
fcm[fcm_hash] = true_value;
fcm_hash = ((fcm_hash 6) ^ (true_value 48)) (table_size - 1);
val_fcm = true_value ^ fcm_prediction;
1つ前のHash値と現在値の(ランダム性の小さい)上位16bitから再計算
1つ前の値から計算したHash値
- 17. Predicator(FCMとDFCM)の設計
• FCMの概要
– 過去の浮動小数点列からHash
Tableを構築
– 直近の値(Hash値)に対応したHash
Tableのエントリを予想値に
17
unsigned long long true_value;
unsigned long long fcm_prediction;
unsigned long long fcm[table_size];
fcm_prediction = fcm[fcm_hash];
fcm[fcm_hash] = true_value;
fcm_hash = ((fcm_hash 6) ^ (true_value 48)) (table_size - 1);
val_fcm = true_value ^ fcm_prediction;
実値と推定値とのXOR
→結果(val_fcm)の先頭に続く0を間引いて保存することで圧縮
- 18. Predicator(FCMとDFCM)の設計
• ‘D(Differencial)’FCMの概要
– 基本的な処理はFCMと同じ
– 推定値をそのままの値を用いるのではなく差分値を利用
– Hash値計算のシフト量を再調整
18
unsigned long long true_value;
unsigned long long dfcm_prediction;
unsigned long long dfcm[table_size];
dfcm_prediction = dfcm[fcm_hash] + last_value;
dfcm[dfcm_hash] = true_value - last_value;
dfcm_hash = ((dfcm_hash 2) ^ (true_value 40)) (table_size - 1);
val_dfcm = true_value ^ dfcm_prediction;
- 23. 参考にした資料
• [1]
The
FPC
Double-‐Precision
Floahng-‐Point
Compression
Algorithm
and
its
Implementahon
– hmp://www.csl.cornell.edu/~burtscher/research/FPC/
• [2]
Floahng-‐Point
Data
Compression
at
75
Gb/s
on
a
GPU
– hmp://dl.acm.org/citahon.cfm?id=1964179.1964189
• [3]
Scienhfic
IEEE
754
64-‐Bit
Double-‐Precision
Floahng-‐Point
Datasets
– hmp://www.csl.cornell.edu/~burtscher/research/FPC/datasets.html
• [4]
Comparing
Floahng
Point
Numbers,
2012
Edihon
– hmp://randomascii.wordpress.com/2012/02/25/comparing-‐floahng-‐point-‐
numbers-‐2012-‐edihon/
• [5]
Radix
Tricks
– hmp://stereopsis.com/radix.html
• [6]
Intel®
64
and
IA-‐32
Architectures
Ophmizahon
Reference
Manual
– hmp://www.intel.com/content/dam/doc/manual/64-‐ia-‐32-‐architectures-‐ophmizahon-‐
manual.pdf
• [7]
Auto-‐vectorizahon
with
gcc
4.7
– hmp://locklessinc.com/arhcles/vectorize/
23