SlideShare a Scribd company logo
From IA-32 to AVX-512
システムプログラミング会
2016/7/2 光成滋生
• IA-32からAVX-512まで主にレジスタサイズの観点から
ゆるゆると観察する小ネタ集
• SIMD成分は少なめ m(_ _)m
概要
2/30
• Intel初の32bit CPU
• 8個の32bit汎用レジスタ eax, ebx, ecx, edx, esi, edi, ebp, esp
• もともと8個の16-bit汎用レジスタを拡張したもの
• eaxの下位16bitがax
• axの下位8bitがal
• レジスタ間はmovで移動
• これが全ての"始まり"かもしれない
i386(Intel 386)
eax
ax
alah
; eax = 0x99887766のとき
mov al, 12h ; eax = 0x99887712, ax = 0x7712
mov ah, 34h ; eax = 0x99883412, ax = 0x3412
3/30
• 命令のフォーマットの一つ
• 8個のレジスタなので3bit
• src(ソース)とdst(デスティネーション)それぞれ必要
• レジスタ間のときはmod = 0b11
ModRM
7 6 5 4 3 2 1 0
+------+------+------+------+------+------+------+------+
| mod | src | reg |
+------+------+------+------+------+------+------+------+
4/30
• 参考文献
• Intel 64 and IA-32 Architectures Software Developer’s Manual
• mov eax, ecxならeax = 0, ecx = 1なので
ModRM = 0b11 001 000 = 0xc8だから8b c8
movの場合
89 /r MOV r/m32,r32 MR ; Move r32 to r/m32
>cat test.asm
mov eax, ecx
>nasm -l a.lst -f win32 test.asm
>cat a.lst
1 00000000 89C8 mov eax, ecx
5/30
• 486DX
• FPU内蔵タイプ
• 8個の80bit浮動小数点数レジスタ st0, st1, ..., st7
• Pentium with MMX
• 8個の64bit SIMDレジスタ mm0, ...., mm7
• 整数演算演算のみサポート
• movd mm0, eaxなど
• K6-2の3D Now!
• AMDがMMXレジスタで浮動小数点数を扱えるように拡張
機能追加
6/30
• 8個の128-bit SIMDレジスタ
• SSE<=>MMX間はmovdq2q, movq2dqなど
• OSの対応が必要
• SSEレジスタの退避、復元が必要
• MMXレジスタはOSの対応は不要だった
• なんで?
• FPUと共用
• 代わりにemms, femmsが必要
• MMXで壊した状態でFPUを使う前にリセット
SSE
7/30
• elfバイナリに文字列を埋め込んでみる
• https://github.com/herumi/misc/blob/master/emb/
• 構想20年 実装3時間w
• 32bitバイナリa.outを用意する(手抜きで64bit不可)
• a.outにhelloという文字列を埋め込んでembファイルを作る
• もちろんembはa.outと同じ動きをする
• embには"hello"が埋め込まれている
小ネタ
>python embed-str.py a.out -o emb -s hello
>python embed-str.py emb
hello
>python embed-str.py a.out
// 何も表示されない
8/30
• 名前しか違わない
• どこに埋め込んだ?
全セクションを逆アセしてみる
>objdump -D --no-show-raw-insn ./a.out > a.asm
>objdump -D --no-show-raw-insn ./emb > b.asm
>diff a.asm b.asm
2c2
< ./a.out: file format elf32i386
---
> ./emb: file format elf32i386
./a.out: file format elf32i386
Disassembly of section .interp:
08048154 <.interp>:
8048154: das
8048155: insb (%dx),%es:(%edi)
8048156: imul
$0x6c2d646c,0x2f(%edx),%esp
804815d: imul
$0x6f732e78,0x75(%esi),%ebp
8048164: xor %cs:(%eax),%al
Disassembly of section .note.ABI-tag:
08048168 <.note.ABI-tag>:
8048168: add $0x0,%al
804816a: add %al,(%eax)
804816c: adc %al,(%eax)
...
9/30
• movのフォーマット
• add, adc, and, xor, or, sbb, sub, cmp, movなど
• @shinhさんコメント
• http://www1.cs.columbia.edu/~angelos/Papers/hydan.pdf
オペランドによって複数の種類がる
89 /r MOV r/m32,r32 MR ; Move r32 to r/m32
8B /r MOV r32,r/m32 RM ; Move r/m32 to r32
89C8 mov eax, ecx
8BC1 mov eax, ecx
10/30
• axを操作したあとeaxを使うとペナルティ
• 依存関係を切る
• Pentum Pro以降のパイプラインの深くなったCPUで発生
• 最近はそれほど気にしなくてもよいかも
• movzxで0拡張するかして幅を揃えるようにする
パーシャルレジスタストール
mov eax, [esi]
mov al, 3
mov ecx, eax ; ペナルティ
11/30
• 16個の64bit汎用レジスタ(r8, ..., r15)
• レジスタを特定するには4bit必要
• ModRMでは1bit足りない
• rexプレフィクス登場
x64
7 6 5 4 3 2 1 0
+------+------+------+------+------+------+------+------+
| 0 1 0 0 | REX.w| REX.r| REX.x| REX.b|
+------+------+------+------+------+------+------+------+
mov <b>, <r> ; b = [b3:b2:b1:b0], r = [r3:r2:r1:r0]
| 0 1 0 0 | 1 !r3 0 !b3 | 0x89 | 1 1 b2 b1 b0 r2 r1 r0|
12/30
• 64bit環境で32bitレジスタを操作すると
上位32bitはクリアされる
• mov ax, 0x1234のときのeaxと挙動が違う
• 多分依存関係を切るため
32bitとの違い
; rax = 0x1234567812345678
mov eax, 0x11223344
; rax = 0x0000000011223344
13/30
• 何もしない命令(0x90)
• 32bit時代はxchg eax, eaxのエリアス
• 64bit自体はeaxの上位がクリアされてしまう!
• NOP = 0x90と定義
• mov eax, eaxも同様
• movzx, eax, al(ゼロ拡張と同じ動き)
• コンパイラの生成コードを見て
無駄なことしてるなと勘違いしないように
NOP
14/30
• 16個の256bit SIMDレジスタ(ymm0, ..., ymm15)
• 下位128bitは xmmレジスタでアクセス
• 3オペランドの命令体系
• addpd ymm0, ymm1, ymm2
• VEXプレフィクス
• レジスタ指定に4bit x 3 + 1(xmmかymmか) = 13bit必要
• かなりややこしい
AVX, AVX2
3byte VEX
|7 6 5 4 3 2 1 0| |7 6 5 4 3 2 1 0| <code> ModRM...
0xC4 |R|X|B|m-m m m m| |W|v v v v|L|p p|
15/30
• SSEの命令はymmレジスタの上位をクリアしない
レガシーSSEとAVX
addpd xmm0, xmm1 ; ymm0の上位は変化せず
vaddpd xmm0, xmm0, xmm1 ; ymm0の上位はクリア
16/30
• fmath(https://github.com/herumi/fmath)
• 高速なexpの近似計算
• http://www.slideshare.net/herumi/exp-9499790
• 性能劣化
• VS2012からVS2013にしたときに標準関数が遅くなる場面
• もちろん普通に使うと速い
悩んだ問題
VS2012 VS2013
std::exp 62.2 349.8
fmath::exp 33.8 33.0
17/30
• ループ回数が7だと遅くならない
• mainでaの値は使われない
最小限のコード(当時)
const struct A {
float a[8];
A() {
const float x = log(2.0f);
for (int i = 0; i < 8; i++) a[i] = x;
}
} a;
int main() {
ここでstd::expを関数ポインタ経由で呼び出すと遅くなる
}
18/30
• 発現条件
• VC2013は8回のループを展開し
vinsertf128というAVXの1命令に置き換えた
• std::expはレガシーなSSEで書かれていた
• 理由
• ymmレジスタの上位が0クリアでないと認識されて
ペナルティを食らっていた
• 解決方法
• コンパイラのバグ(もちろん修正済み)
• AVXを使った後SSEを使う可能性があるときはvzeroupperで
ゼロクリアしなければならない
• ただ混在しないようにするのが理想
• 遅くなる関数自体には問題がないので分かりにくい
何が起こっていたのか
19/30
• Intel最適化マニュアル11章
• Mixing AVX Code with SSE Code
CPUは状態を持っている
20/30
• Intelのエミュレータ
• https://software.intel.com/en-us/articles/pre-release-license-
agreement-for-intel-software-development-emulator-accept-
end-user-license-agreement-and-download
検出ツール
vzeroupperなし
sde -ast -- nonzero-upper-penalty.exe
# AVX_to_SSE_transition_instances: 102
# SSE_to_AVX_transition_instances: 102
vzeroupperあり
sde -ast -- nonzero-upper-penalty.exe 1
# AVX_to_SSE_transition_instances: 0
# SSE_to_AVX_transition_instances: 0
21/30
• https://github.com/herumi/opti/blob/master/nonzero-upper-
penalty.cpp
• vzeroupperを呼ばないと1.8倍ぐらい遅くなる
サンプル
struct Code : public Xbyak::CodeGenerator {
explicit Code(bool clear)
{
vxorpd(ym0, ym0);
if (clear) vzeroupper();
mov(eax, N);
L("@@");
addpd(xm0, xm0);
sub(eax, 1);
jnz("@b");
ret();
}
};
22/30
• Intel 64 and IA-32 Architectures Software Developer's
Manual, Volume 3 System Programming Guide
• 19章Performance-Monitoring Events
Linuxのperf
Event Umask mnemonic 説明
C1h 08h OTHER_ASSISTS.AVX_TO_SSE AVX-256からSSEへの切り替え回数
C1h 10h OTHER_ASSISTS.SSE_TO_AVX SSEからAVX-256への切り替え回数
perf stat -e r08c1 -e r10c1 ./nonzero-upper-penalty
Performance counter stats for './ nonzero-upper-penalty ':
10000001 r08c1
9999978 r10c1
23/30
• 32個の512bit SIMDレジスタ(zmm0, ..., zmm31)
• 5bit x 3 + 2(XかYかZか)= 17bit必要
• VEXでは足りないのでEVEX
• 7個の64bitマスクレジスタ(k0, ..., k7)
• 演算結果の一部をゼロにしたりできる
• 指定が自由にできる
• マスクレジスタ自体多少の演算ができる
• kaddw k1, k2, k3 ; kshiftlq k1, k2, 5 ; etc.
• 命令ごとに丸め方法を指定できる
• nearest, toward -inf, toward +inf, round to zero
• AVX-512は○オペランド?
AVX-512
24/30
• 3オペランド?
• 丸め方法の指定
• マスクレジスタの指定
• ゼロで埋めるか
例
vaddpd zmm10, zmm20, zmm30
vaddpd zmm10, zmm20, zmm30, {rd-sae}
vaddpd zmm10{k2}, zmm20, zmm30, {rd-sae}
vaddpd zmm10{k2}{z}, zmm20, zmm30, {rd-sae}
25/30
• とてもややこしい
EVEX
| EVEX |
|0x62 P0 P1 P2| opcode ModRM/M [SIB] [Disp] [Imm]
| 7 6 5 4 3 2 1 0 |
P0 | R | X | B | R'| 0 | 0 | m | m |
P1 | W | v | v | v | v | 1 | p | p |
P2 | z | L'| L | b | V'| a | a | a |
vaddpd [a4 a3 a2 a1 a0],[b4 b3 b2 b1 b0],[c4 c3 c2 c1 c0]
0x62|!a3 !c4 !c3 !a4 0001|1 b3 b2 b1 b0 101|0100 !b4 aaa|
<code> |11 a2 a1 a0 c2 c1 c0| ...
26/30
• zmm0=[8:7:6:5:4:3:2:1], [rax] = [2:1]のときどうなるか
ゼロクリアクイズ(問題)
命令 意味 結果
movsd xmm0, xmm0 最下位doubleを移動
movsd xmm0, [rax] 最下位doubleを移動
vmovsd xmm0, xmm0, xmm0 最下位doubleを移動
vmovsd xmm0, [rax] 最下位doubleを移動
addsd xmm0, xmm0 最下位doubleを加算
addpd xmm0, xmm0 double x 2を加算
vaddsd xmm0, xmm0, xmm0 最下位doubleを加算
vaddpd xmm0, xmm0, xmm0 double x 2を加算
vaddpd ymm0, ymm0, ymm0 double x 4を加算
27/30
命令 意味 効果
movsd xmm0, xmm0 最下位doubleを移動 [8:7:6:5:4:3:2:1]
movsd xmm0, [rax] 最下位doubleを移動 [8:7:6:5:4:3:0:1]
vmovsd xmm0, xmm0, xmm0 最下位doubleを移動 [0:0:0:0:0:0:2:1]
vmovsd xmm0, [rax] 最下位doubleを移動 [0:0:0:0:0:0:0:1]
addsd xmm0, xmm0 最下位doubleを加算 [8:7:6:5:4:3:2:2]
addpd xmm0, xmm0 double x 2を加算 [8:7:6:5:4:3:4:2]
vaddsd xmm0, xmm0, xmm0 最下位doubleを加算 [0:0:0:0:0:0:2:2]
vaddpd xmm0, xmm0, xmm0 double x 2を加算 [0:0:0:0:0:0:4:2]
vaddpd ymm0, ymm0, ymm0 double x 4を加算 [0:0:0:0:8:6:4:2]
ゼロクリアクイズ(答え)
• zmm0=[8:7:6:5:4:3:2:1], [rax] = [2:1]のときどうなるか
• https://github.com/herumi/opti/tree/master/upper-zero
28/30
• 512bit x 32 = 2048byte = 2KiB!
• コンテキストスイッチの度に全部保存?
• xsaveopt, xsavec
• Vol. 1 13章「Managing State Using the XSAVE Feature Set」
• メモリコピーを減らす仕組み
• 各レジスタが変更されたか否かのビット情報を保持
• その情報にしたがって必要なものだけ退避する命令
レジスタの退避・復元
29/30
• SIMDはテーブル引きに弱い
• Haswellで登場(しかし使わない方が速いぐらいだった)
• Skylakeでかなり改善された
• AVX-512ではマスクレジスタが登場して大分使いやすくなっ
た(ようだ)
(おまけ)高速化されたgather命令
int tbl[16];
double a[16], b[16];
for (int i = 0; i < 16; i++) {
b[i] = a[tbl[i]];
}
vmovdqu zmm0, [rsp + tbl]
kxnor k1, k0, k0 ; 全部1をたてる(c ← !(a ^ b))
vpgatherdd zmm2{k1}, [rax + zmm0 * 4]
30/30

More Related Content

What's hot

AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
Ryoma Sin'ya
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
Fixstars Corporation
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
Fixstars Corporation
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
Takateru Yamagishi
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
MITSUNARI Shigeo
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
Atsushi KOMIYA
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
京大 マイコンクラブ
 
ARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくい
wata2ki
 
動的計画法
動的計画法動的計画法
公開用_講演資料_SCSK.pdf
公開用_講演資料_SCSK.pdf公開用_講演資料_SCSK.pdf
公開用_講演資料_SCSK.pdf
直久 住川
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング
道化師 堂華
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
 
競プロでGo!
競プロでGo!競プロでGo!
競プロでGo!
鈴木 セシル
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
Fixstars Corporation
 
DPDKを用いたネットワークスタック,高性能通信基盤開発
DPDKを用いたネットワークスタック,高性能通信基盤開発DPDKを用いたネットワークスタック,高性能通信基盤開発
DPDKを用いたネットワークスタック,高性能通信基盤開発
slankdev
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
MITSUNARI Shigeo
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
Kohsuke Yuasa
 

What's hot (20)

AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみるDSIRNLP #3 LZ4 の速さの秘密に迫ってみる
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
ARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくいARM LinuxのMMUはわかりにくい
ARM LinuxのMMUはわかりにくい
 
動的計画法
動的計画法動的計画法
動的計画法
 
公開用_講演資料_SCSK.pdf
公開用_講演資料_SCSK.pdf公開用_講演資料_SCSK.pdf
公開用_講演資料_SCSK.pdf
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
競プロでGo!
競プロでGo!競プロでGo!
競プロでGo!
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
 
DPDKを用いたネットワークスタック,高性能通信基盤開発
DPDKを用いたネットワークスタック,高性能通信基盤開発DPDKを用いたネットワークスタック,高性能通信基盤開発
DPDKを用いたネットワークスタック,高性能通信基盤開発
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 

Viewers also liked

汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
MITSUNARI Shigeo
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧め
MITSUNARI Shigeo
 
GoogleのSHA-1のはなし
GoogleのSHA-1のはなしGoogleのSHA-1のはなし
GoogleのSHA-1のはなし
MITSUNARI Shigeo
 
Cybozu Tech Conference 2016 バグの調べ方
Cybozu Tech Conference 2016 バグの調べ方Cybozu Tech Conference 2016 バグの調べ方
Cybozu Tech Conference 2016 バグの調べ方
MITSUNARI Shigeo
 
『データ解析におけるプライバシー保護』勉強会 #2
『データ解析におけるプライバシー保護』勉強会 #2『データ解析におけるプライバシー保護』勉強会 #2
『データ解析におけるプライバシー保護』勉強会 #2
MITSUNARI Shigeo
 
『データ解析におけるプライバシー保護』勉強会
『データ解析におけるプライバシー保護』勉強会『データ解析におけるプライバシー保護』勉強会
『データ解析におけるプライバシー保護』勉強会
MITSUNARI Shigeo
 
Emcjp item33,34
Emcjp item33,34Emcjp item33,34
Emcjp item33,34
MITSUNARI Shigeo
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
MITSUNARI Shigeo
 
暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -
MITSUNARI Shigeo
 
改ざん検知暗号Minalpherの設計とIvy Bridge/Haswellでの最適化
改ざん検知暗号Minalpherの設計とIvy Bridge/Haswellでの最適化改ざん検知暗号Minalpherの設計とIvy Bridge/Haswellでの最適化
改ざん検知暗号Minalpherの設計とIvy Bridge/Haswellでの最適化
MITSUNARI Shigeo
 
Backdoors with the MS Office file encryption master key and a proposal for a ...
Backdoors with the MS Office file encryption master key and a proposal for a ...Backdoors with the MS Office file encryption master key and a proposal for a ...
Backdoors with the MS Office file encryption master key and a proposal for a ...
MITSUNARI Shigeo
 
バックドア耐性のあるパスワード暗号化の提案
バックドア耐性のあるパスワード暗号化の提案バックドア耐性のあるパスワード暗号化の提案
バックドア耐性のあるパスワード暗号化の提案
MITSUNARI Shigeo
 
emcjp Item 42
emcjp Item 42emcjp Item 42
emcjp Item 42
MITSUNARI Shigeo
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
MITSUNARI Shigeo
 
楕円曲線入門 トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門 トーラスと楕円曲線のつながり
MITSUNARI Shigeo
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)MITSUNARI Shigeo
 
MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策
MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策
MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策
MITSUNARI Shigeo
 

Viewers also liked (20)

汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧め
 
GoogleのSHA-1のはなし
GoogleのSHA-1のはなしGoogleのSHA-1のはなし
GoogleのSHA-1のはなし
 
Cybozu Tech Conference 2016 バグの調べ方
Cybozu Tech Conference 2016 バグの調べ方Cybozu Tech Conference 2016 バグの調べ方
Cybozu Tech Conference 2016 バグの調べ方
 
『データ解析におけるプライバシー保護』勉強会 #2
『データ解析におけるプライバシー保護』勉強会 #2『データ解析におけるプライバシー保護』勉強会 #2
『データ解析におけるプライバシー保護』勉強会 #2
 
『データ解析におけるプライバシー保護』勉強会
『データ解析におけるプライバシー保護』勉強会『データ解析におけるプライバシー保護』勉強会
『データ解析におけるプライバシー保護』勉強会
 
Slide dist
Slide distSlide dist
Slide dist
 
Emcjp item33,34
Emcjp item33,34Emcjp item33,34
Emcjp item33,34
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -
 
Memory sanitizer
Memory sanitizerMemory sanitizer
Memory sanitizer
 
改ざん検知暗号Minalpherの設計とIvy Bridge/Haswellでの最適化
改ざん検知暗号Minalpherの設計とIvy Bridge/Haswellでの最適化改ざん検知暗号Minalpherの設計とIvy Bridge/Haswellでの最適化
改ざん検知暗号Minalpherの設計とIvy Bridge/Haswellでの最適化
 
Backdoors with the MS Office file encryption master key and a proposal for a ...
Backdoors with the MS Office file encryption master key and a proposal for a ...Backdoors with the MS Office file encryption master key and a proposal for a ...
Backdoors with the MS Office file encryption master key and a proposal for a ...
 
バックドア耐性のあるパスワード暗号化の提案
バックドア耐性のあるパスワード暗号化の提案バックドア耐性のあるパスワード暗号化の提案
バックドア耐性のあるパスワード暗号化の提案
 
emcjp Item 42
emcjp Item 42emcjp Item 42
emcjp Item 42
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
楕円曲線入門 トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門 トーラスと楕円曲線のつながり
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
 
MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策
MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策
MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策
 

Similar to From IA-32 to avx-512

ゆるバグ
ゆるバグゆるバグ
ゆるバグ
MITSUNARI Shigeo
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
MITSUNARI Shigeo
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
Masami Ichikawa
 
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++  MIX #10x64 のスカラー,SIMD 演算性能を測ってみた @ C++  MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
Muneyoshi Suzuki
 
HPC Phys-20201203
HPC Phys-20201203HPC Phys-20201203
HPC Phys-20201203
MITSUNARI Shigeo
 
x64 のスカラー,SIMD 演算性能を測ってみた v0.1 @ C++ MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた v0.1 @ C++  MIX #10x64 のスカラー,SIMD 演算性能を測ってみた v0.1 @ C++  MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた v0.1 @ C++ MIX #10
Muneyoshi Suzuki
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介MITSUNARI Shigeo
 
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010Tsukasa Oi
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
MITSUNARI Shigeo
 
20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部
NVIDIA Japan
 
アセンブラ短歌(第2回APASEC+第2期サイボウズ・ラボユース合同勉強会)
アセンブラ短歌(第2回APASEC+第2期サイボウズ・ラボユース合同勉強会)アセンブラ短歌(第2回APASEC+第2期サイボウズ・ラボユース合同勉強会)
アセンブラ短歌(第2回APASEC+第2期サイボウズ・ラボユース合同勉強会)
kozossakai
 
optimal Ate pairing
optimal Ate pairingoptimal Ate pairing
optimal Ate pairing
MITSUNARI Shigeo
 
Windowsのパケットモニタ作成
Windowsのパケットモニタ作成Windowsのパケットモニタ作成
Windowsのパケットモニタ作成
Shinichi Hirauchi
 
あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿
MITSUNARI Shigeo
 
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜Takuya ASADA
 
Boost.SIMD
Boost.SIMDBoost.SIMD
Boost.SIMD
Akira Takahashi
 

Similar to From IA-32 to avx-512 (20)

ゆるバグ
ゆるバグゆるバグ
ゆるバグ
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++  MIX #10x64 のスカラー,SIMD 演算性能を測ってみた @ C++  MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた @ C++ MIX #10
 
HPC Phys-20201203
HPC Phys-20201203HPC Phys-20201203
HPC Phys-20201203
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
x64 のスカラー,SIMD 演算性能を測ってみた v0.1 @ C++ MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた v0.1 @ C++  MIX #10x64 のスカラー,SIMD 演算性能を測ってみた v0.1 @ C++  MIX #10
x64 のスカラー,SIMD 演算性能を測ってみた v0.1 @ C++ MIX #10
 
Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介Haswellサーベイと有限体クラスの紹介
Haswellサーベイと有限体クラスの紹介
 
PFI Seminar 2010/02/18
PFI Seminar 2010/02/18PFI Seminar 2010/02/18
PFI Seminar 2010/02/18
 
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
d-kami x86-2
d-kami x86-2d-kami x86-2
d-kami x86-2
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部
 
アセンブラ短歌(第2回APASEC+第2期サイボウズ・ラボユース合同勉強会)
アセンブラ短歌(第2回APASEC+第2期サイボウズ・ラボユース合同勉強会)アセンブラ短歌(第2回APASEC+第2期サイボウズ・ラボユース合同勉強会)
アセンブラ短歌(第2回APASEC+第2期サイボウズ・ラボユース合同勉強会)
 
optimal Ate pairing
optimal Ate pairingoptimal Ate pairing
optimal Ate pairing
 
Windowsのパケットモニタ作成
Windowsのパケットモニタ作成Windowsのパケットモニタ作成
Windowsのパケットモニタ作成
 
あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿あなたの知らないnopたち@ラボユース合宿
あなたの知らないnopたち@ラボユース合宿
 
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
BHyVeでOSvを起動したい
〜BIOSがなくてもこの先生きのこるには〜
 
Boost.SIMD
Boost.SIMDBoost.SIMD
Boost.SIMD
 

More from MITSUNARI Shigeo

範囲証明つき準同型暗号とその対話的プロトコル
範囲証明つき準同型暗号とその対話的プロトコル範囲証明つき準同型暗号とその対話的プロトコル
範囲証明つき準同型暗号とその対話的プロトコル
MITSUNARI Shigeo
 
暗認本読書会13 advanced
暗認本読書会13 advanced暗認本読書会13 advanced
暗認本読書会13 advanced
MITSUNARI Shigeo
 
暗認本読書会12
暗認本読書会12暗認本読書会12
暗認本読書会12
MITSUNARI Shigeo
 
暗認本読書会11
暗認本読書会11暗認本読書会11
暗認本読書会11
MITSUNARI Shigeo
 
暗認本読書会10
暗認本読書会10暗認本読書会10
暗認本読書会10
MITSUNARI Shigeo
 
暗認本読書会9
暗認本読書会9暗認本読書会9
暗認本読書会9
MITSUNARI Shigeo
 
暗認本読書会8
暗認本読書会8暗認本読書会8
暗認本読書会8
MITSUNARI Shigeo
 
暗認本読書会7
暗認本読書会7暗認本読書会7
暗認本読書会7
MITSUNARI Shigeo
 
暗認本読書会6
暗認本読書会6暗認本読書会6
暗認本読書会6
MITSUNARI Shigeo
 
暗認本読書会5
暗認本読書会5暗認本読書会5
暗認本読書会5
MITSUNARI Shigeo
 
暗認本読書会4
暗認本読書会4暗認本読書会4
暗認本読書会4
MITSUNARI Shigeo
 
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
MITSUNARI Shigeo
 
私とOSSの25年
私とOSSの25年私とOSSの25年
私とOSSの25年
MITSUNARI Shigeo
 
Lifted-ElGamal暗号を用いた任意関数演算の二者間秘密計算プロトコルのmaliciousモデルにおける効率化
Lifted-ElGamal暗号を用いた任意関数演算の二者間秘密計算プロトコルのmaliciousモデルにおける効率化Lifted-ElGamal暗号を用いた任意関数演算の二者間秘密計算プロトコルのmaliciousモデルにおける効率化
Lifted-ElGamal暗号を用いた任意関数演算の二者間秘密計算プロトコルのmaliciousモデルにおける効率化
MITSUNARI Shigeo
 
楕円曲線と暗号
楕円曲線と暗号楕円曲線と暗号
楕円曲線と暗号
MITSUNARI Shigeo
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用
MITSUNARI Shigeo
 
LazyFP vulnerabilityの紹介
LazyFP vulnerabilityの紹介LazyFP vulnerabilityの紹介
LazyFP vulnerabilityの紹介
MITSUNARI Shigeo
 
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
MITSUNARI Shigeo
 
集約署名
集約署名集約署名
集約署名
MITSUNARI Shigeo
 
暗号化したまま計算できる暗号技術とOSS開発による広がり
暗号化したまま計算できる暗号技術とOSS開発による広がり暗号化したまま計算できる暗号技術とOSS開発による広がり
暗号化したまま計算できる暗号技術とOSS開発による広がり
MITSUNARI Shigeo
 

More from MITSUNARI Shigeo (20)

範囲証明つき準同型暗号とその対話的プロトコル
範囲証明つき準同型暗号とその対話的プロトコル範囲証明つき準同型暗号とその対話的プロトコル
範囲証明つき準同型暗号とその対話的プロトコル
 
暗認本読書会13 advanced
暗認本読書会13 advanced暗認本読書会13 advanced
暗認本読書会13 advanced
 
暗認本読書会12
暗認本読書会12暗認本読書会12
暗認本読書会12
 
暗認本読書会11
暗認本読書会11暗認本読書会11
暗認本読書会11
 
暗認本読書会10
暗認本読書会10暗認本読書会10
暗認本読書会10
 
暗認本読書会9
暗認本読書会9暗認本読書会9
暗認本読書会9
 
暗認本読書会8
暗認本読書会8暗認本読書会8
暗認本読書会8
 
暗認本読書会7
暗認本読書会7暗認本読書会7
暗認本読書会7
 
暗認本読書会6
暗認本読書会6暗認本読書会6
暗認本読書会6
 
暗認本読書会5
暗認本読書会5暗認本読書会5
暗認本読書会5
 
暗認本読書会4
暗認本読書会4暗認本読書会4
暗認本読書会4
 
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
深層学習フレームワークにおけるIntel CPU/富岳向け最適化法
 
私とOSSの25年
私とOSSの25年私とOSSの25年
私とOSSの25年
 
Lifted-ElGamal暗号を用いた任意関数演算の二者間秘密計算プロトコルのmaliciousモデルにおける効率化
Lifted-ElGamal暗号を用いた任意関数演算の二者間秘密計算プロトコルのmaliciousモデルにおける効率化Lifted-ElGamal暗号を用いた任意関数演算の二者間秘密計算プロトコルのmaliciousモデルにおける効率化
Lifted-ElGamal暗号を用いた任意関数演算の二者間秘密計算プロトコルのmaliciousモデルにおける効率化
 
楕円曲線と暗号
楕円曲線と暗号楕円曲線と暗号
楕円曲線と暗号
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用
 
LazyFP vulnerabilityの紹介
LazyFP vulnerabilityの紹介LazyFP vulnerabilityの紹介
LazyFP vulnerabilityの紹介
 
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
 
集約署名
集約署名集約署名
集約署名
 
暗号化したまま計算できる暗号技術とOSS開発による広がり
暗号化したまま計算できる暗号技術とOSS開発による広がり暗号化したまま計算できる暗号技術とOSS開発による広がり
暗号化したまま計算できる暗号技術とOSS開発による広がり
 

Recently uploaded

FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
atsushi061452
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 

Recently uploaded (16)

FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 

From IA-32 to avx-512

  • 1. From IA-32 to AVX-512 システムプログラミング会 2016/7/2 光成滋生
  • 3. • Intel初の32bit CPU • 8個の32bit汎用レジスタ eax, ebx, ecx, edx, esi, edi, ebp, esp • もともと8個の16-bit汎用レジスタを拡張したもの • eaxの下位16bitがax • axの下位8bitがal • レジスタ間はmovで移動 • これが全ての"始まり"かもしれない i386(Intel 386) eax ax alah ; eax = 0x99887766のとき mov al, 12h ; eax = 0x99887712, ax = 0x7712 mov ah, 34h ; eax = 0x99883412, ax = 0x3412 3/30
  • 4. • 命令のフォーマットの一つ • 8個のレジスタなので3bit • src(ソース)とdst(デスティネーション)それぞれ必要 • レジスタ間のときはmod = 0b11 ModRM 7 6 5 4 3 2 1 0 +------+------+------+------+------+------+------+------+ | mod | src | reg | +------+------+------+------+------+------+------+------+ 4/30
  • 5. • 参考文献 • Intel 64 and IA-32 Architectures Software Developer’s Manual • mov eax, ecxならeax = 0, ecx = 1なので ModRM = 0b11 001 000 = 0xc8だから8b c8 movの場合 89 /r MOV r/m32,r32 MR ; Move r32 to r/m32 >cat test.asm mov eax, ecx >nasm -l a.lst -f win32 test.asm >cat a.lst 1 00000000 89C8 mov eax, ecx 5/30
  • 6. • 486DX • FPU内蔵タイプ • 8個の80bit浮動小数点数レジスタ st0, st1, ..., st7 • Pentium with MMX • 8個の64bit SIMDレジスタ mm0, ...., mm7 • 整数演算演算のみサポート • movd mm0, eaxなど • K6-2の3D Now! • AMDがMMXレジスタで浮動小数点数を扱えるように拡張 機能追加 6/30
  • 7. • 8個の128-bit SIMDレジスタ • SSE<=>MMX間はmovdq2q, movq2dqなど • OSの対応が必要 • SSEレジスタの退避、復元が必要 • MMXレジスタはOSの対応は不要だった • なんで? • FPUと共用 • 代わりにemms, femmsが必要 • MMXで壊した状態でFPUを使う前にリセット SSE 7/30
  • 8. • elfバイナリに文字列を埋め込んでみる • https://github.com/herumi/misc/blob/master/emb/ • 構想20年 実装3時間w • 32bitバイナリa.outを用意する(手抜きで64bit不可) • a.outにhelloという文字列を埋め込んでembファイルを作る • もちろんembはa.outと同じ動きをする • embには"hello"が埋め込まれている 小ネタ >python embed-str.py a.out -o emb -s hello >python embed-str.py emb hello >python embed-str.py a.out // 何も表示されない 8/30
  • 9. • 名前しか違わない • どこに埋め込んだ? 全セクションを逆アセしてみる >objdump -D --no-show-raw-insn ./a.out > a.asm >objdump -D --no-show-raw-insn ./emb > b.asm >diff a.asm b.asm 2c2 < ./a.out: file format elf32i386 --- > ./emb: file format elf32i386 ./a.out: file format elf32i386 Disassembly of section .interp: 08048154 <.interp>: 8048154: das 8048155: insb (%dx),%es:(%edi) 8048156: imul $0x6c2d646c,0x2f(%edx),%esp 804815d: imul $0x6f732e78,0x75(%esi),%ebp 8048164: xor %cs:(%eax),%al Disassembly of section .note.ABI-tag: 08048168 <.note.ABI-tag>: 8048168: add $0x0,%al 804816a: add %al,(%eax) 804816c: adc %al,(%eax) ... 9/30
  • 10. • movのフォーマット • add, adc, and, xor, or, sbb, sub, cmp, movなど • @shinhさんコメント • http://www1.cs.columbia.edu/~angelos/Papers/hydan.pdf オペランドによって複数の種類がる 89 /r MOV r/m32,r32 MR ; Move r32 to r/m32 8B /r MOV r32,r/m32 RM ; Move r/m32 to r32 89C8 mov eax, ecx 8BC1 mov eax, ecx 10/30
  • 11. • axを操作したあとeaxを使うとペナルティ • 依存関係を切る • Pentum Pro以降のパイプラインの深くなったCPUで発生 • 最近はそれほど気にしなくてもよいかも • movzxで0拡張するかして幅を揃えるようにする パーシャルレジスタストール mov eax, [esi] mov al, 3 mov ecx, eax ; ペナルティ 11/30
  • 12. • 16個の64bit汎用レジスタ(r8, ..., r15) • レジスタを特定するには4bit必要 • ModRMでは1bit足りない • rexプレフィクス登場 x64 7 6 5 4 3 2 1 0 +------+------+------+------+------+------+------+------+ | 0 1 0 0 | REX.w| REX.r| REX.x| REX.b| +------+------+------+------+------+------+------+------+ mov <b>, <r> ; b = [b3:b2:b1:b0], r = [r3:r2:r1:r0] | 0 1 0 0 | 1 !r3 0 !b3 | 0x89 | 1 1 b2 b1 b0 r2 r1 r0| 12/30
  • 13. • 64bit環境で32bitレジスタを操作すると 上位32bitはクリアされる • mov ax, 0x1234のときのeaxと挙動が違う • 多分依存関係を切るため 32bitとの違い ; rax = 0x1234567812345678 mov eax, 0x11223344 ; rax = 0x0000000011223344 13/30
  • 14. • 何もしない命令(0x90) • 32bit時代はxchg eax, eaxのエリアス • 64bit自体はeaxの上位がクリアされてしまう! • NOP = 0x90と定義 • mov eax, eaxも同様 • movzx, eax, al(ゼロ拡張と同じ動き) • コンパイラの生成コードを見て 無駄なことしてるなと勘違いしないように NOP 14/30
  • 15. • 16個の256bit SIMDレジスタ(ymm0, ..., ymm15) • 下位128bitは xmmレジスタでアクセス • 3オペランドの命令体系 • addpd ymm0, ymm1, ymm2 • VEXプレフィクス • レジスタ指定に4bit x 3 + 1(xmmかymmか) = 13bit必要 • かなりややこしい AVX, AVX2 3byte VEX |7 6 5 4 3 2 1 0| |7 6 5 4 3 2 1 0| <code> ModRM... 0xC4 |R|X|B|m-m m m m| |W|v v v v|L|p p| 15/30
  • 16. • SSEの命令はymmレジスタの上位をクリアしない レガシーSSEとAVX addpd xmm0, xmm1 ; ymm0の上位は変化せず vaddpd xmm0, xmm0, xmm1 ; ymm0の上位はクリア 16/30
  • 17. • fmath(https://github.com/herumi/fmath) • 高速なexpの近似計算 • http://www.slideshare.net/herumi/exp-9499790 • 性能劣化 • VS2012からVS2013にしたときに標準関数が遅くなる場面 • もちろん普通に使うと速い 悩んだ問題 VS2012 VS2013 std::exp 62.2 349.8 fmath::exp 33.8 33.0 17/30
  • 18. • ループ回数が7だと遅くならない • mainでaの値は使われない 最小限のコード(当時) const struct A { float a[8]; A() { const float x = log(2.0f); for (int i = 0; i < 8; i++) a[i] = x; } } a; int main() { ここでstd::expを関数ポインタ経由で呼び出すと遅くなる } 18/30
  • 19. • 発現条件 • VC2013は8回のループを展開し vinsertf128というAVXの1命令に置き換えた • std::expはレガシーなSSEで書かれていた • 理由 • ymmレジスタの上位が0クリアでないと認識されて ペナルティを食らっていた • 解決方法 • コンパイラのバグ(もちろん修正済み) • AVXを使った後SSEを使う可能性があるときはvzeroupperで ゼロクリアしなければならない • ただ混在しないようにするのが理想 • 遅くなる関数自体には問題がないので分かりにくい 何が起こっていたのか 19/30
  • 20. • Intel最適化マニュアル11章 • Mixing AVX Code with SSE Code CPUは状態を持っている 20/30
  • 21. • Intelのエミュレータ • https://software.intel.com/en-us/articles/pre-release-license- agreement-for-intel-software-development-emulator-accept- end-user-license-agreement-and-download 検出ツール vzeroupperなし sde -ast -- nonzero-upper-penalty.exe # AVX_to_SSE_transition_instances: 102 # SSE_to_AVX_transition_instances: 102 vzeroupperあり sde -ast -- nonzero-upper-penalty.exe 1 # AVX_to_SSE_transition_instances: 0 # SSE_to_AVX_transition_instances: 0 21/30
  • 22. • https://github.com/herumi/opti/blob/master/nonzero-upper- penalty.cpp • vzeroupperを呼ばないと1.8倍ぐらい遅くなる サンプル struct Code : public Xbyak::CodeGenerator { explicit Code(bool clear) { vxorpd(ym0, ym0); if (clear) vzeroupper(); mov(eax, N); L("@@"); addpd(xm0, xm0); sub(eax, 1); jnz("@b"); ret(); } }; 22/30
  • 23. • Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3 System Programming Guide • 19章Performance-Monitoring Events Linuxのperf Event Umask mnemonic 説明 C1h 08h OTHER_ASSISTS.AVX_TO_SSE AVX-256からSSEへの切り替え回数 C1h 10h OTHER_ASSISTS.SSE_TO_AVX SSEからAVX-256への切り替え回数 perf stat -e r08c1 -e r10c1 ./nonzero-upper-penalty Performance counter stats for './ nonzero-upper-penalty ': 10000001 r08c1 9999978 r10c1 23/30
  • 24. • 32個の512bit SIMDレジスタ(zmm0, ..., zmm31) • 5bit x 3 + 2(XかYかZか)= 17bit必要 • VEXでは足りないのでEVEX • 7個の64bitマスクレジスタ(k0, ..., k7) • 演算結果の一部をゼロにしたりできる • 指定が自由にできる • マスクレジスタ自体多少の演算ができる • kaddw k1, k2, k3 ; kshiftlq k1, k2, 5 ; etc. • 命令ごとに丸め方法を指定できる • nearest, toward -inf, toward +inf, round to zero • AVX-512は○オペランド? AVX-512 24/30
  • 25. • 3オペランド? • 丸め方法の指定 • マスクレジスタの指定 • ゼロで埋めるか 例 vaddpd zmm10, zmm20, zmm30 vaddpd zmm10, zmm20, zmm30, {rd-sae} vaddpd zmm10{k2}, zmm20, zmm30, {rd-sae} vaddpd zmm10{k2}{z}, zmm20, zmm30, {rd-sae} 25/30
  • 26. • とてもややこしい EVEX | EVEX | |0x62 P0 P1 P2| opcode ModRM/M [SIB] [Disp] [Imm] | 7 6 5 4 3 2 1 0 | P0 | R | X | B | R'| 0 | 0 | m | m | P1 | W | v | v | v | v | 1 | p | p | P2 | z | L'| L | b | V'| a | a | a | vaddpd [a4 a3 a2 a1 a0],[b4 b3 b2 b1 b0],[c4 c3 c2 c1 c0] 0x62|!a3 !c4 !c3 !a4 0001|1 b3 b2 b1 b0 101|0100 !b4 aaa| <code> |11 a2 a1 a0 c2 c1 c0| ... 26/30
  • 27. • zmm0=[8:7:6:5:4:3:2:1], [rax] = [2:1]のときどうなるか ゼロクリアクイズ(問題) 命令 意味 結果 movsd xmm0, xmm0 最下位doubleを移動 movsd xmm0, [rax] 最下位doubleを移動 vmovsd xmm0, xmm0, xmm0 最下位doubleを移動 vmovsd xmm0, [rax] 最下位doubleを移動 addsd xmm0, xmm0 最下位doubleを加算 addpd xmm0, xmm0 double x 2を加算 vaddsd xmm0, xmm0, xmm0 最下位doubleを加算 vaddpd xmm0, xmm0, xmm0 double x 2を加算 vaddpd ymm0, ymm0, ymm0 double x 4を加算 27/30
  • 28. 命令 意味 効果 movsd xmm0, xmm0 最下位doubleを移動 [8:7:6:5:4:3:2:1] movsd xmm0, [rax] 最下位doubleを移動 [8:7:6:5:4:3:0:1] vmovsd xmm0, xmm0, xmm0 最下位doubleを移動 [0:0:0:0:0:0:2:1] vmovsd xmm0, [rax] 最下位doubleを移動 [0:0:0:0:0:0:0:1] addsd xmm0, xmm0 最下位doubleを加算 [8:7:6:5:4:3:2:2] addpd xmm0, xmm0 double x 2を加算 [8:7:6:5:4:3:4:2] vaddsd xmm0, xmm0, xmm0 最下位doubleを加算 [0:0:0:0:0:0:2:2] vaddpd xmm0, xmm0, xmm0 double x 2を加算 [0:0:0:0:0:0:4:2] vaddpd ymm0, ymm0, ymm0 double x 4を加算 [0:0:0:0:8:6:4:2] ゼロクリアクイズ(答え) • zmm0=[8:7:6:5:4:3:2:1], [rax] = [2:1]のときどうなるか • https://github.com/herumi/opti/tree/master/upper-zero 28/30
  • 29. • 512bit x 32 = 2048byte = 2KiB! • コンテキストスイッチの度に全部保存? • xsaveopt, xsavec • Vol. 1 13章「Managing State Using the XSAVE Feature Set」 • メモリコピーを減らす仕組み • 各レジスタが変更されたか否かのビット情報を保持 • その情報にしたがって必要なものだけ退避する命令 レジスタの退避・復元 29/30
  • 30. • SIMDはテーブル引きに弱い • Haswellで登場(しかし使わない方が速いぐらいだった) • Skylakeでかなり改善された • AVX-512ではマスクレジスタが登場して大分使いやすくなっ た(ようだ) (おまけ)高速化されたgather命令 int tbl[16]; double a[16], b[16]; for (int i = 0; i < 16; i++) { b[i] = a[tbl[i]]; } vmovdqu zmm0, [rsp + tbl] kxnor k1, k0, k0 ; 全部1をたてる(c ← !(a ^ b)) vpgatherdd zmm2{k1}, [rax + zmm0 * 4] 30/30