SlideShare a Scribd company logo
パタヘネゼミ第2回
(2.11~2.22)
担当 奥村
2.11 並列処理と命令 : 同期
 同期、協調動作がなぜ必要か
◦ 競合(race condition)が起こるから
◦ OS,シスプロでやった
 atomicな処理
 相互排除(mutual exclusion)
 実現方法は?
◦ OSの授業でやったように様々ある
2.11 並列処理と命令 : 同期
 MIPSでどのように実現されているか
◦ load linked , store conditional
◦ 2つで1組、対をなす命令
2.12 プログラムの翻訳と起動
 Cのコードはどうなって動くか
◦ コンパイラ
◦ アセンブラ
◦ リンカ
◦ ローダ
2.12 プログラムの翻訳と起動
 コンパイラ
◦ アセンブリに翻訳
◦ 昔は色々アセンブリで書かれてたらしい
 アセンブラ
◦ アセンブリ(疑似命令を含む)をオブジェク
トファイルに変換
 機械語命令とそれをメモリに適切に配置するた
めの情報からなるファイル
 未決定な参照とかが残ってる
2.12 プログラムの翻訳と起動
 リンカ
◦ オブジェクトファイルとライブラリを結
びつけ、すべての外部参照を解明する
◦ 出力は実行ファイル(executable file)
 ローダ
◦ ディスク上の実行ファイルをメモリに読
み込む
2.12 プログラムの翻訳と起動
 ライブラリのリンクの問題点
◦ リンクされた後にライブラリが更新され
ても反映されない
◦ 使うのがほんの一部の機能だけでもすべ
てのライブラリをリンクすると実行ファ
イルが巨大に
 DLL(dynamically linked library)
2.12 プログラムの翻訳と起動
 Javaの場合
◦ コンセプト”いかなるコンピュータ上でも
すばやく安全に実行できる”
 コンパイル
◦ Javaバイトコードに
 インタプリタで実行可能な命令セット
 Javaに近くコンパイル負荷が軽い
 最適化もほぼしない
◦ Cとの比較
 アセンブリは”コンピュータ依存”だった
2.12 プログラムの翻訳と起動
 Javaバイトコードのインタプリタ
◦ JVM(Java Virtual Machine)
 インタプリタ
◦ 移植性高い
◦ 速度は遅い
 速度の改善
◦ JIT(Just-in-time)コンパイラ
 プログラムのよく使われてる部分を見つけてコ
ンピュータのネイティブな命令セットにコンパ
イル
2.13 Cプログラムの例題解説
 アセンブリ演習でやったような内容な
ので省略
2.14 配列とポインタの対比
 配列に添え字でアクセスするのとポイ
ンタでアクセスする場合にアセンブリ
はどう異なるか?
 ここでの例は配列をすべて0クリアす
る場合
2.14 配列とポインタの対比
 素朴にアセンブリで書いてみる
◦ ループ内部のみ
 添字ver.
◦ 1. iを4倍
◦ 2. 先頭アドレスに足してアドレスを計算
◦ 3. 0をストア
◦ 4. iをインクリメント
◦ 5. iがサイズより小さいか判定
◦ 6. 判定結果をみて先頭に戻るか終了
2.14 配列とポインタの対比
 素朴にアセンブリで書いてみる
◦ ループ内部のみ
 ポインタver.
◦ 1. pの指す場所に0をストア
◦ 2. pを4増やす
◦ 3. 要素数の4倍を計算
◦ 4. 先頭アドレスと要素数から最後尾のア
ドレスを計算
◦ 5. pが配列の最後尾以前かどうか比較
◦ 6. 判定結果をみて先頭に戻るか終了
2.14 配列とポインタの対比
 どちらもループ内は6命令のみ
◦ 差はない?
 ポインタver.の3,4に着目
◦ 1. pの指す場所に0をストア
◦ 2. pを4増やす
◦ 3. 要素数の4倍を計算
◦ 4. 先頭アドレスと要素数から最後尾のア
ドレスを計算
◦ 5. pが配列の最後尾以前かどうか比較
◦ 6. 判定結果をみて先頭に戻るか終了
2.14 配列とポインタの対比
 ポインタver.の3,4に着目
◦ 3. 要素数の4倍を計算
◦ 4. 先頭アドレスと要素数から最後尾のア
ドレスを計算
 ここで計算される値は定数
◦ ループ内で計算する必要はない
◦ ループ外で1度計算しておけばよい
 ループあたり4命令に減った!
◦ うれしい
2.14 配列とポインタの対比
 添字ver.でも同様に効率化できるか?
◦ 6つともiに依存した計算をしている
◦ 無理そう
 ならばプログラマは積極的にポインタ
で書くべきか?
◦ コンパイラは賢いので最適化してくれる
◦ 変に意識するよりもわかりやすく書くべ
き
2.15 CとJavaの実行
 コンパイラの内部
◦ 言語ごとのフロントエンド
 一般的な中間表現に変換
◦ 高水準オプティマイザ
 ループ展開,インライン展開
◦ グローバルオプティマイザ
 大域的、局所的最適化
 レジスタ割付
◦ コードジェネレータ
 詳細な命令の選択、マシンに依存した最適化
2.15 CとJavaの実行
 フロントエンド
◦ 言語依存
◦ 字句解析,構文解析,…
 言語処理系論でやったやつ
◦ 最終的に中間表現を出力
2.15 CとJavaの実行
 高水準オプティマイザ
◦ ソースレベルでの変形
◦ ループ展開、インライン展開
◦ 多重ループの入れ替えなど
 詳しくは5章
2.15 CとJavaの実行
 局所的最適化
◦ 基本ブロック(スコープ)内での最適化
 いろいろある
◦ 強度低減
◦ 定数伝播
◦ コピー伝播
◦ 不要ストア削除
◦ 不要コード削除
2.15 CとJavaの実行
 大域的最適化
◦ 複数の基本ブロック(スコープ)をまたぐ最
適化
 いろいろある
◦ コード移動
◦ 誘導変数削除
 配列とポインタでやったやつ
2.15 CとJavaの実行
 局所最適化と比較して最適化できるか
どうかの判定が難しい
◦ それはそう
◦ データフロー解析により制御フローグラ
フを構築し依存関係から判断
 当然最悪の場合を想定
2.15 CとJavaの実行
 レジスタ割付け
◦ メモリのロード/ストアをサボりたい
◦ 何度もアクセスするメモリの値はレジス
タに置いときたい
 レジスタはそんなに多くはない
2.15 CとJavaの実行
 レジスタ割付けの判断
◦ 変数の使用情報をデータフロー解析し
リージョンと呼ばれる単位を頂点とした
干渉グラフを作成
 レジスタ割付の問題は干渉グラフのグ
ラフ彩色問題に帰着
◦ 前回すこし触れた…?
2.15 CとJavaの実行
 レジスタの個数以下で彩色できるとは
限らない
◦ 必要に応じてメモリにスピルアウトする
◦ スピルアウトはリージョン(頂点)の分割に
対応
 コンパイラはいい感じにこれらをやっ
てくれてるらしい
◦ すごい
2.16 ARMv7の命令
 ARMv7とは
◦ 組み込み機器用に普及している命令セッ
トアーキテクチャ
◦ 設計思想はMIPSと似ている
 MIPSとの違い
◦ レジスタがMIPSより少ない(半分)
◦ アドレッシングモードが9つもある
 MIPSは3つだった(計算機構成論でやった)
2.16 ARMv7の命令
 比較とOpxフィールド
◦ MIPSでは比較結果はレジスタにある
◦ ARMでは4つの条件コードビットを用いる
 負、ゼロ、桁上げ、オーバーフロー
 PowerPCの演習や計算機システムでやった
CR(Condition Register)みたいなもの?
◦ ARMの命令にはOpxという4ビットの
フィールドがあり、4つの条件ビットとの
組み合わせで命令をnopにすることができ
る
2.17 x86の命令
 Intel x86の発展
◦ 1978年:Intel8086アーキテクチャが発表された。それは、当時成功を収めていた
8ビット・マイクロプロセッサであるIntel8080のアセンブリ言語と互換性のあ
る機能拡張と位置づけられた。8086は16ビット・アーキテクチャであり内部レ
ジスタ長はすべて16ビットであった。MIPSとは異なり,8086のレジスタは専用
化されていた。したがって、8086は汎用レジスタ(general-purpose register :
GPR)アーキテクチャとはみなされていない。
◦ 1980年:Intel8087浮動小数点コプロセッサが発表された。このアーキテクチャは
約60の浮動小数点命令を追加して、8086を拡張したものである。このアーキテ
クチャはレジスタを使用する代わりにスタックに依存していた。
◦ 1982年:80286アーキテクチャを32ビットに拡張した80386が発表された。32
ビット・レジスタおよび32ビット・アドレス空間を備えた32ビット・アーキテ
クチャに加え、80386では新しいアドレッシング・モードと命令操作が追加さ
れた。それによって、80396は汎用レジスタ・マシンに近くなった。80386では、
セグメント方式のアドレシングに加え、ページ方式がサポートされるように
なった。80286と同様、80386には8086のプログラムを修正せずに実行できる
モードが用意されていた。
◦ 1989-95年: 1989年にi486が、1992年にPentinumが、1995年にPentium Proが、
次々と発表された。これは性能の向上を目的としたものであり、命令セット
◦ 上ユーザーに見えるものは4つしか追加されていない。そのうちの3つはマルチ
プロセッシング…
2.17 x86の命令
 Intel x86の発展
◦ 1978年:Intel8086アーキテクチャが発表された。それは、当時成功を収めていた
8ビット・マイクロプロセッサであるIntel8080のアセンブリ言語と互換性のあ
る機能拡張と位置づけられた。8086は16ビット・アーキテクチャであり内部レ
ジスタ長はすべて16ビットであった。MIPSとは異なり,8086のレジスタは専用
化されていた。したがって、8086は汎用レジスタ(general-purpose register :
GPR)アーキテクチャとはみなされていない。
◦ 1980年:Intel8087浮動小数点コプロセッサが発表された。このアーキテクチャは
約60の浮動小数点命令を追加して、8086を拡張したものである。このアーキテ
クチャはレジスタを使用する代わりにスタックに依存していた。
◦ 1982年:80286アーキテクチャを32ビットに拡張した80386が発表された。32
ビット・レジスタおよび32ビット・アドレス空間を備えた32ビット・アーキテ
クチャに加え、80386では新しいアドレッシング・モードと命令操作が追加さ
れた。それによって、80396は汎用レジスタ・マシンに近くなった。80386では、
セグメント方式のアドレシングに加え、ページ方式がサポートされるように
なった。80286と同様、80386には8086のプログラムを修正せずに実行できる
モードが用意されていた。
◦ 1989-95年: 1989年にi486が、1992年にPentinumが、1995年にPentium Proが、
次々と発表された。これは性能の向上を目的としたものであり、命令セット
◦ 上ユーザーに見えるものは4つしか追加されていない。そのうちの3つはマルチ
プロセッシング…
2.17 x86の命令
 レジスタが少ない。GPRが8本しかな
い(ARMv7の半分)
 命令の特徴
◦ 可変長(1~15byte)
◦ オペランドの1つがソースとデスティネー
ションを兼ねないといけない
 オペランドの1つは必ず変更される
◦ オペランドにメモリ中でもいい
 MIPSやARMv7はレジスタか即値だけだった
◦ プレフィックスで命令動作を変えられる
2.18 ARMv8の命令
 ARMv7の64bit版
◦ どんどんアドレス空間がでかくなる
◦ レジスタの大きさもでかくなる
 結構大きく変更されてめっちゃMIPS
に近くなったらしい
 “その結果、ARMv7とARMv8の主な類
似点は、名称となった”
◦ これすき
2.19 誤信と落とし穴
 命令を強力にすれば性能が改善される
◦ クロック数とか増えすぎるとまずい
◦ 命令数と命令の複雑さのトレードオフ
 アセンブリで組むと早い
◦ コンパイラに勝てないか同等なので高級
言語で書こう!(アセンブリ書きたい人とかいるんか…?)
2章の演習問題
 面白そうな問題があればpick up
2章の演習問題
 面白そうな問題があればpick up
◦ ありませんでした

More Related Content

What's hot

仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディング仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディング
Takuya ASADA
 
MySQLやSSDとかの話 前編
MySQLやSSDとかの話 前編MySQLやSSDとかの話 前編
MySQLやSSDとかの話 前編
Takanori Sejima
 
EWD 3トレーニング・コース #2 EWD 3 の概要
EWD 3トレーニング・コース #2 EWD 3 の概要EWD 3トレーニング・コース #2 EWD 3 の概要
EWD 3トレーニング・コース #2 EWD 3 の概要
Kiyoshi Sawada
 
運用に効く!JVMオプション三選
運用に効く!JVMオプション三選運用に効く!JVMオプション三選
運用に効く!JVMオプション三選
Kazuhiro Oinuma
 
NAND Flash から InnoDB にかけての話(仮)
NAND Flash から InnoDB にかけての話(仮)NAND Flash から InnoDB にかけての話(仮)
NAND Flash から InnoDB にかけての話(仮)
Takanori Sejima
 
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
エピック・ゲームズ・ジャパン Epic Games Japan
 
LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版
LINE Corporation
 
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)Takeshi HASEGAWA
 
【モノビットエンジン勉強会inサイバーコネクトツー】 第一部「モノビットエンジンVer2.0シリーズ概要」
【モノビットエンジン勉強会inサイバーコネクトツー】 第一部「モノビットエンジンVer2.0シリーズ概要」【モノビットエンジン勉強会inサイバーコネクトツー】 第一部「モノビットエンジンVer2.0シリーズ概要」
【モノビットエンジン勉強会inサイバーコネクトツー】 第一部「モノビットエンジンVer2.0シリーズ概要」
モノビット エンジン
 
MySQLやSSDとかの話・後編
MySQLやSSDとかの話・後編MySQLやSSDとかの話・後編
MySQLやSSDとかの話・後編
gree_tech
 
UE4におけるLoadingとGCのProfilingと最適化手法
UE4におけるLoadingとGCのProfilingと最適化手法UE4におけるLoadingとGCのProfilingと最適化手法
UE4におけるLoadingとGCのProfilingと最適化手法
エピック・ゲームズ・ジャパン Epic Games Japan
 
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
Ryosuke MATSUMOTO
 
InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)
Takanori Sejima
 
MySQLやSSDとかの話 その後
MySQLやSSDとかの話 その後MySQLやSSDとかの話 その後
MySQLやSSDとかの話 その後
Takanori Sejima
 
20apr2012 kernelvm7-main
20apr2012 kernelvm7-main20apr2012 kernelvm7-main
20apr2012 kernelvm7-mainShotaro Uchida
 
Mod mrubyについて
Mod mrubyについてMod mrubyについて
Mod mrubyについて
Ryosuke MATSUMOTO
 
sysloadや監視などの話(仮)
sysloadや監視などの話(仮)sysloadや監視などの話(仮)
sysloadや監視などの話(仮)
Takanori Sejima
 
XenServer Overview
XenServer OverviewXenServer Overview
XenServer Overview
Kimihiko Kitase
 
binary log と 2PC と Group Commit
binary log と 2PC と Group Commitbinary log と 2PC と Group Commit
binary log と 2PC と Group Commit
Takanori Sejima
 

What's hot (20)

仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディング仮想化環境におけるパケットフォワーディング
仮想化環境におけるパケットフォワーディング
 
MySQLやSSDとかの話 前編
MySQLやSSDとかの話 前編MySQLやSSDとかの話 前編
MySQLやSSDとかの話 前編
 
EWD 3トレーニング・コース #2 EWD 3 の概要
EWD 3トレーニング・コース #2 EWD 3 の概要EWD 3トレーニング・コース #2 EWD 3 の概要
EWD 3トレーニング・コース #2 EWD 3 の概要
 
運用に効く!JVMオプション三選
運用に効く!JVMオプション三選運用に効く!JVMオプション三選
運用に効く!JVMオプション三選
 
KVM+cgroup
KVM+cgroupKVM+cgroup
KVM+cgroup
 
NAND Flash から InnoDB にかけての話(仮)
NAND Flash から InnoDB にかけての話(仮)NAND Flash から InnoDB にかけての話(仮)
NAND Flash から InnoDB にかけての話(仮)
 
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
 
LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版
 
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
エンジニアなら知っておきたい「仮想マシン」のしくみ v1.1 (hbstudy 17)
 
【モノビットエンジン勉強会inサイバーコネクトツー】 第一部「モノビットエンジンVer2.0シリーズ概要」
【モノビットエンジン勉強会inサイバーコネクトツー】 第一部「モノビットエンジンVer2.0シリーズ概要」【モノビットエンジン勉強会inサイバーコネクトツー】 第一部「モノビットエンジンVer2.0シリーズ概要」
【モノビットエンジン勉強会inサイバーコネクトツー】 第一部「モノビットエンジンVer2.0シリーズ概要」
 
MySQLやSSDとかの話・後編
MySQLやSSDとかの話・後編MySQLやSSDとかの話・後編
MySQLやSSDとかの話・後編
 
UE4におけるLoadingとGCのProfilingと最適化手法
UE4におけるLoadingとGCのProfilingと最適化手法UE4におけるLoadingとGCのProfilingと最適化手法
UE4におけるLoadingとGCのProfilingと最適化手法
 
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
 
InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)InnoDBのすゝめ(仮)
InnoDBのすゝめ(仮)
 
MySQLやSSDとかの話 その後
MySQLやSSDとかの話 その後MySQLやSSDとかの話 その後
MySQLやSSDとかの話 その後
 
20apr2012 kernelvm7-main
20apr2012 kernelvm7-main20apr2012 kernelvm7-main
20apr2012 kernelvm7-main
 
Mod mrubyについて
Mod mrubyについてMod mrubyについて
Mod mrubyについて
 
sysloadや監視などの話(仮)
sysloadや監視などの話(仮)sysloadや監視などの話(仮)
sysloadや監視などの話(仮)
 
XenServer Overview
XenServer OverviewXenServer Overview
XenServer Overview
 
binary log と 2PC と Group Commit
binary log と 2PC と Group Commitbinary log と 2PC と Group Commit
binary log と 2PC と Group Commit
 

Similar to パタヘネゼミ 第2回

データベース勉強会 In 広島 mongodb
データベース勉強会 In 広島  mongodbデータベース勉強会 In 広島  mongodb
データベース勉強会 In 広島 mongodb
Ryuji Tamagawa
 
async/await不要論
async/await不要論async/await不要論
async/await不要論
bleis tift
 
読みやすいプログラム、書き換えやすいプログラム
読みやすいプログラム、書き換えやすいプログラム読みやすいプログラム、書き換えやすいプログラム
読みやすいプログラム、書き換えやすいプログラム
amusementcreators
 
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案Keisuke Umeno
 
LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122
nothingcosmos
 
Cloud Foundry構成概要 111018
Cloud Foundry構成概要 111018Cloud Foundry構成概要 111018
Cloud Foundry構成概要 111018
Uemura Yuichi
 
TAM 新人ディレクター システムスキルアップ プログラム 第7回 「プログラム言語」
TAM 新人ディレクター システムスキルアップ プログラム 第7回 「プログラム言語」TAM 新人ディレクター システムスキルアップ プログラム 第7回 「プログラム言語」
TAM 新人ディレクター システムスキルアップ プログラム 第7回 「プログラム言語」(株)TAM
 
serverless
serverlessserverless
serverless
Akira Otsuka
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
sandai
 
Edge os(vyos)の基本(入門編)
Edge os(vyos)の基本(入門編)Edge os(vyos)の基本(入門編)
Edge os(vyos)の基本(入門編)
Akira Kaneda
 
試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShiftEtsuji Nakai
 
Extract and edit
Extract and editExtract and edit
Extract and edit
禎晃 山崎
 
インフラエンジニアがk8sでアプリを作って見えた今後のインフラ
インフラエンジニアがk8sでアプリを作って見えた今後のインフラインフラエンジニアがk8sでアプリを作って見えた今後のインフラ
インフラエンジニアがk8sでアプリを作って見えた今後のインフラ
susumu tanaka
 
C++ AMPを使ってみよう
C++ AMPを使ってみようC++ AMPを使ってみよう
C++ AMPを使ってみよう
Osamu Masutani
 
ななめ45°から見たJavaOne
ななめ45°から見たJavaOneななめ45°から見たJavaOne
ななめ45°から見たJavaOneAdvancedTechNight
 
xDB Replication ブローシャー
xDB Replication ブローシャーxDB Replication ブローシャー
xDB Replication ブローシャーYuji Fujita
 
JavaFX + NetBeans環境におけるJenkinsの活用(Jenkins第六回勉強会)
JavaFX + NetBeans環境におけるJenkinsの活用(Jenkins第六回勉強会)JavaFX + NetBeans環境におけるJenkinsの活用(Jenkins第六回勉強会)
JavaFX + NetBeans環境におけるJenkinsの活用(Jenkins第六回勉強会)
Ryusaburo Tanaka
 
2020 acl learning_to_recover_from_multi-modality_errors_for_non-autoregressiv...
2020 acl learning_to_recover_from_multi-modality_errors_for_non-autoregressiv...2020 acl learning_to_recover_from_multi-modality_errors_for_non-autoregressiv...
2020 acl learning_to_recover_from_multi-modality_errors_for_non-autoregressiv...
広樹 本間
 

Similar to パタヘネゼミ 第2回 (20)

データベース勉強会 In 広島 mongodb
データベース勉強会 In 広島  mongodbデータベース勉強会 In 広島  mongodb
データベース勉強会 In 広島 mongodb
 
async/await不要論
async/await不要論async/await不要論
async/await不要論
 
読みやすいプログラム、書き換えやすいプログラム
読みやすいプログラム、書き換えやすいプログラム読みやすいプログラム、書き換えやすいプログラム
読みやすいプログラム、書き換えやすいプログラム
 
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案分散メモリ環境におけるシェルスクリプトの高速化手法の提案
分散メモリ環境におけるシェルスクリプトの高速化手法の提案
 
LLVM overview 20110122
LLVM overview 20110122LLVM overview 20110122
LLVM overview 20110122
 
Cloud Foundry構成概要 111018
Cloud Foundry構成概要 111018Cloud Foundry構成概要 111018
Cloud Foundry構成概要 111018
 
TAM 新人ディレクター システムスキルアップ プログラム 第7回 「プログラム言語」
TAM 新人ディレクター システムスキルアップ プログラム 第7回 「プログラム言語」TAM 新人ディレクター システムスキルアップ プログラム 第7回 「プログラム言語」
TAM 新人ディレクター システムスキルアップ プログラム 第7回 「プログラム言語」
 
C#の書き方
C#の書き方C#の書き方
C#の書き方
 
C#の書き方
C#の書き方C#の書き方
C#の書き方
 
serverless
serverlessserverless
serverless
 
【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門【学習メモ#1st】12ステップで作る組込みOS自作入門
【学習メモ#1st】12ステップで作る組込みOS自作入門
 
Edge os(vyos)の基本(入門編)
Edge os(vyos)の基本(入門編)Edge os(vyos)の基本(入門編)
Edge os(vyos)の基本(入門編)
 
試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift
 
Extract and edit
Extract and editExtract and edit
Extract and edit
 
インフラエンジニアがk8sでアプリを作って見えた今後のインフラ
インフラエンジニアがk8sでアプリを作って見えた今後のインフラインフラエンジニアがk8sでアプリを作って見えた今後のインフラ
インフラエンジニアがk8sでアプリを作って見えた今後のインフラ
 
C++ AMPを使ってみよう
C++ AMPを使ってみようC++ AMPを使ってみよう
C++ AMPを使ってみよう
 
ななめ45°から見たJavaOne
ななめ45°から見たJavaOneななめ45°から見たJavaOne
ななめ45°から見たJavaOne
 
xDB Replication ブローシャー
xDB Replication ブローシャーxDB Replication ブローシャー
xDB Replication ブローシャー
 
JavaFX + NetBeans環境におけるJenkinsの活用(Jenkins第六回勉強会)
JavaFX + NetBeans環境におけるJenkinsの活用(Jenkins第六回勉強会)JavaFX + NetBeans環境におけるJenkinsの活用(Jenkins第六回勉強会)
JavaFX + NetBeans環境におけるJenkinsの活用(Jenkins第六回勉強会)
 
2020 acl learning_to_recover_from_multi-modality_errors_for_non-autoregressiv...
2020 acl learning_to_recover_from_multi-modality_errors_for_non-autoregressiv...2020 acl learning_to_recover_from_multi-modality_errors_for_non-autoregressiv...
2020 acl learning_to_recover_from_multi-modality_errors_for_non-autoregressiv...
 

More from okuraofvegetable

Monadic second-order logic
Monadic second-order logicMonadic second-order logic
Monadic second-order logic
okuraofvegetable
 
直交領域探索
直交領域探索直交領域探索
直交領域探索
okuraofvegetable
 
グレブナー基底
グレブナー基底グレブナー基底
グレブナー基底
okuraofvegetable
 
NPCA summer 2014
NPCA summer 2014NPCA summer 2014
NPCA summer 2014
okuraofvegetable
 
JOI summer seminar 2014
JOI summer seminar 2014JOI summer seminar 2014
JOI summer seminar 2014
okuraofvegetable
 
Lecture2
Lecture2Lecture2
LT
LTLT
Wrapping potato chips is fun
Wrapping potato chips is funWrapping potato chips is fun
Wrapping potato chips is fun
okuraofvegetable
 

More from okuraofvegetable (8)

Monadic second-order logic
Monadic second-order logicMonadic second-order logic
Monadic second-order logic
 
直交領域探索
直交領域探索直交領域探索
直交領域探索
 
グレブナー基底
グレブナー基底グレブナー基底
グレブナー基底
 
NPCA summer 2014
NPCA summer 2014NPCA summer 2014
NPCA summer 2014
 
JOI summer seminar 2014
JOI summer seminar 2014JOI summer seminar 2014
JOI summer seminar 2014
 
Lecture2
Lecture2Lecture2
Lecture2
 
LT
LTLT
LT
 
Wrapping potato chips is fun
Wrapping potato chips is funWrapping potato chips is fun
Wrapping potato chips is fun
 

パタヘネゼミ 第2回

  • 2. 2.11 並列処理と命令 : 同期  同期、協調動作がなぜ必要か ◦ 競合(race condition)が起こるから ◦ OS,シスプロでやった  atomicな処理  相互排除(mutual exclusion)  実現方法は? ◦ OSの授業でやったように様々ある
  • 3. 2.11 並列処理と命令 : 同期  MIPSでどのように実現されているか ◦ load linked , store conditional ◦ 2つで1組、対をなす命令
  • 4. 2.12 プログラムの翻訳と起動  Cのコードはどうなって動くか ◦ コンパイラ ◦ アセンブラ ◦ リンカ ◦ ローダ
  • 5. 2.12 プログラムの翻訳と起動  コンパイラ ◦ アセンブリに翻訳 ◦ 昔は色々アセンブリで書かれてたらしい  アセンブラ ◦ アセンブリ(疑似命令を含む)をオブジェク トファイルに変換  機械語命令とそれをメモリに適切に配置するた めの情報からなるファイル  未決定な参照とかが残ってる
  • 6. 2.12 プログラムの翻訳と起動  リンカ ◦ オブジェクトファイルとライブラリを結 びつけ、すべての外部参照を解明する ◦ 出力は実行ファイル(executable file)  ローダ ◦ ディスク上の実行ファイルをメモリに読 み込む
  • 7. 2.12 プログラムの翻訳と起動  ライブラリのリンクの問題点 ◦ リンクされた後にライブラリが更新され ても反映されない ◦ 使うのがほんの一部の機能だけでもすべ てのライブラリをリンクすると実行ファ イルが巨大に  DLL(dynamically linked library)
  • 8. 2.12 プログラムの翻訳と起動  Javaの場合 ◦ コンセプト”いかなるコンピュータ上でも すばやく安全に実行できる”  コンパイル ◦ Javaバイトコードに  インタプリタで実行可能な命令セット  Javaに近くコンパイル負荷が軽い  最適化もほぼしない ◦ Cとの比較  アセンブリは”コンピュータ依存”だった
  • 9. 2.12 プログラムの翻訳と起動  Javaバイトコードのインタプリタ ◦ JVM(Java Virtual Machine)  インタプリタ ◦ 移植性高い ◦ 速度は遅い  速度の改善 ◦ JIT(Just-in-time)コンパイラ  プログラムのよく使われてる部分を見つけてコ ンピュータのネイティブな命令セットにコンパ イル
  • 12. 2.14 配列とポインタの対比  素朴にアセンブリで書いてみる ◦ ループ内部のみ  添字ver. ◦ 1. iを4倍 ◦ 2. 先頭アドレスに足してアドレスを計算 ◦ 3. 0をストア ◦ 4. iをインクリメント ◦ 5. iがサイズより小さいか判定 ◦ 6. 判定結果をみて先頭に戻るか終了
  • 13. 2.14 配列とポインタの対比  素朴にアセンブリで書いてみる ◦ ループ内部のみ  ポインタver. ◦ 1. pの指す場所に0をストア ◦ 2. pを4増やす ◦ 3. 要素数の4倍を計算 ◦ 4. 先頭アドレスと要素数から最後尾のア ドレスを計算 ◦ 5. pが配列の最後尾以前かどうか比較 ◦ 6. 判定結果をみて先頭に戻るか終了
  • 14. 2.14 配列とポインタの対比  どちらもループ内は6命令のみ ◦ 差はない?  ポインタver.の3,4に着目 ◦ 1. pの指す場所に0をストア ◦ 2. pを4増やす ◦ 3. 要素数の4倍を計算 ◦ 4. 先頭アドレスと要素数から最後尾のア ドレスを計算 ◦ 5. pが配列の最後尾以前かどうか比較 ◦ 6. 判定結果をみて先頭に戻るか終了
  • 15. 2.14 配列とポインタの対比  ポインタver.の3,4に着目 ◦ 3. 要素数の4倍を計算 ◦ 4. 先頭アドレスと要素数から最後尾のア ドレスを計算  ここで計算される値は定数 ◦ ループ内で計算する必要はない ◦ ループ外で1度計算しておけばよい  ループあたり4命令に減った! ◦ うれしい
  • 16. 2.14 配列とポインタの対比  添字ver.でも同様に効率化できるか? ◦ 6つともiに依存した計算をしている ◦ 無理そう  ならばプログラマは積極的にポインタ で書くべきか? ◦ コンパイラは賢いので最適化してくれる ◦ 変に意識するよりもわかりやすく書くべ き
  • 17. 2.15 CとJavaの実行  コンパイラの内部 ◦ 言語ごとのフロントエンド  一般的な中間表現に変換 ◦ 高水準オプティマイザ  ループ展開,インライン展開 ◦ グローバルオプティマイザ  大域的、局所的最適化  レジスタ割付 ◦ コードジェネレータ  詳細な命令の選択、マシンに依存した最適化
  • 18. 2.15 CとJavaの実行  フロントエンド ◦ 言語依存 ◦ 字句解析,構文解析,…  言語処理系論でやったやつ ◦ 最終的に中間表現を出力
  • 19. 2.15 CとJavaの実行  高水準オプティマイザ ◦ ソースレベルでの変形 ◦ ループ展開、インライン展開 ◦ 多重ループの入れ替えなど  詳しくは5章
  • 20. 2.15 CとJavaの実行  局所的最適化 ◦ 基本ブロック(スコープ)内での最適化  いろいろある ◦ 強度低減 ◦ 定数伝播 ◦ コピー伝播 ◦ 不要ストア削除 ◦ 不要コード削除
  • 21. 2.15 CとJavaの実行  大域的最適化 ◦ 複数の基本ブロック(スコープ)をまたぐ最 適化  いろいろある ◦ コード移動 ◦ 誘導変数削除  配列とポインタでやったやつ
  • 22. 2.15 CとJavaの実行  局所最適化と比較して最適化できるか どうかの判定が難しい ◦ それはそう ◦ データフロー解析により制御フローグラ フを構築し依存関係から判断  当然最悪の場合を想定
  • 23. 2.15 CとJavaの実行  レジスタ割付け ◦ メモリのロード/ストアをサボりたい ◦ 何度もアクセスするメモリの値はレジス タに置いときたい  レジスタはそんなに多くはない
  • 24. 2.15 CとJavaの実行  レジスタ割付けの判断 ◦ 変数の使用情報をデータフロー解析し リージョンと呼ばれる単位を頂点とした 干渉グラフを作成  レジスタ割付の問題は干渉グラフのグ ラフ彩色問題に帰着 ◦ 前回すこし触れた…?
  • 25. 2.15 CとJavaの実行  レジスタの個数以下で彩色できるとは 限らない ◦ 必要に応じてメモリにスピルアウトする ◦ スピルアウトはリージョン(頂点)の分割に 対応  コンパイラはいい感じにこれらをやっ てくれてるらしい ◦ すごい
  • 26. 2.16 ARMv7の命令  ARMv7とは ◦ 組み込み機器用に普及している命令セッ トアーキテクチャ ◦ 設計思想はMIPSと似ている  MIPSとの違い ◦ レジスタがMIPSより少ない(半分) ◦ アドレッシングモードが9つもある  MIPSは3つだった(計算機構成論でやった)
  • 27. 2.16 ARMv7の命令  比較とOpxフィールド ◦ MIPSでは比較結果はレジスタにある ◦ ARMでは4つの条件コードビットを用いる  負、ゼロ、桁上げ、オーバーフロー  PowerPCの演習や計算機システムでやった CR(Condition Register)みたいなもの? ◦ ARMの命令にはOpxという4ビットの フィールドがあり、4つの条件ビットとの 組み合わせで命令をnopにすることができ る
  • 28. 2.17 x86の命令  Intel x86の発展 ◦ 1978年:Intel8086アーキテクチャが発表された。それは、当時成功を収めていた 8ビット・マイクロプロセッサであるIntel8080のアセンブリ言語と互換性のあ る機能拡張と位置づけられた。8086は16ビット・アーキテクチャであり内部レ ジスタ長はすべて16ビットであった。MIPSとは異なり,8086のレジスタは専用 化されていた。したがって、8086は汎用レジスタ(general-purpose register : GPR)アーキテクチャとはみなされていない。 ◦ 1980年:Intel8087浮動小数点コプロセッサが発表された。このアーキテクチャは 約60の浮動小数点命令を追加して、8086を拡張したものである。このアーキテ クチャはレジスタを使用する代わりにスタックに依存していた。 ◦ 1982年:80286アーキテクチャを32ビットに拡張した80386が発表された。32 ビット・レジスタおよび32ビット・アドレス空間を備えた32ビット・アーキテ クチャに加え、80386では新しいアドレッシング・モードと命令操作が追加さ れた。それによって、80396は汎用レジスタ・マシンに近くなった。80386では、 セグメント方式のアドレシングに加え、ページ方式がサポートされるように なった。80286と同様、80386には8086のプログラムを修正せずに実行できる モードが用意されていた。 ◦ 1989-95年: 1989年にi486が、1992年にPentinumが、1995年にPentium Proが、 次々と発表された。これは性能の向上を目的としたものであり、命令セット ◦ 上ユーザーに見えるものは4つしか追加されていない。そのうちの3つはマルチ プロセッシング…
  • 29. 2.17 x86の命令  Intel x86の発展 ◦ 1978年:Intel8086アーキテクチャが発表された。それは、当時成功を収めていた 8ビット・マイクロプロセッサであるIntel8080のアセンブリ言語と互換性のあ る機能拡張と位置づけられた。8086は16ビット・アーキテクチャであり内部レ ジスタ長はすべて16ビットであった。MIPSとは異なり,8086のレジスタは専用 化されていた。したがって、8086は汎用レジスタ(general-purpose register : GPR)アーキテクチャとはみなされていない。 ◦ 1980年:Intel8087浮動小数点コプロセッサが発表された。このアーキテクチャは 約60の浮動小数点命令を追加して、8086を拡張したものである。このアーキテ クチャはレジスタを使用する代わりにスタックに依存していた。 ◦ 1982年:80286アーキテクチャを32ビットに拡張した80386が発表された。32 ビット・レジスタおよび32ビット・アドレス空間を備えた32ビット・アーキテ クチャに加え、80386では新しいアドレッシング・モードと命令操作が追加さ れた。それによって、80396は汎用レジスタ・マシンに近くなった。80386では、 セグメント方式のアドレシングに加え、ページ方式がサポートされるように なった。80286と同様、80386には8086のプログラムを修正せずに実行できる モードが用意されていた。 ◦ 1989-95年: 1989年にi486が、1992年にPentinumが、1995年にPentium Proが、 次々と発表された。これは性能の向上を目的としたものであり、命令セット ◦ 上ユーザーに見えるものは4つしか追加されていない。そのうちの3つはマルチ プロセッシング…
  • 30. 2.17 x86の命令  レジスタが少ない。GPRが8本しかな い(ARMv7の半分)  命令の特徴 ◦ 可変長(1~15byte) ◦ オペランドの1つがソースとデスティネー ションを兼ねないといけない  オペランドの1つは必ず変更される ◦ オペランドにメモリ中でもいい  MIPSやARMv7はレジスタか即値だけだった ◦ プレフィックスで命令動作を変えられる
  • 31. 2.18 ARMv8の命令  ARMv7の64bit版 ◦ どんどんアドレス空間がでかくなる ◦ レジスタの大きさもでかくなる  結構大きく変更されてめっちゃMIPS に近くなったらしい  “その結果、ARMv7とARMv8の主な類 似点は、名称となった” ◦ これすき
  • 32. 2.19 誤信と落とし穴  命令を強力にすれば性能が改善される ◦ クロック数とか増えすぎるとまずい ◦ 命令数と命令の複雑さのトレードオフ  アセンブリで組むと早い ◦ コンパイラに勝てないか同等なので高級 言語で書こう!(アセンブリ書きたい人とかいるんか…?)