吉田/覚書/復習と改良案(Pico16o)
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[吉田>吉田]]/[[覚書>吉田/覚書]]
>[[''グループD作業用ページ''>第14回ASICデザインコンテスト/作業用(五十嵐・吉田・矢吹)]]
#contents
で。
**現状の改良案、随時更新。 [#sc0f4021]
*''&color(red){赤字};は未実装''*
-回路部
--pico16o.h
---未定。~
--pico16o.sfl
---不要回路記述、不要命令の削除。~
---加算機の改良。
>並列プレフィクス加算機(APPNA)のHanCarlsonを導入。~
---パイプライン化。~
>段数は現在の2段で行く予定。~
---フォワーディング回路。~|4/4|r44|11,402|42.4|214|7,432|0.77(96.2%:2.98%)|しっかり論理合成 & ドキュメント改稿|
---
---命令追加(ldvl, stvl, &color(red){pop};, push)~---命令の追加。~|4/4|r44|11,402|42.4|214|7,432|0.77(96.2%:2.98%)|しっかり論理合成 & ドキュメント改稿|
>回路部と共通。~
>回路面積増加に見合うだけの効果があるか。~
>>ldvl,stvl:即値(インデックス)使用のロードストア。~
>>pop,push:スタック操作時のaddi,subi(というかPP,MM)を同時に行えるロードストア命令。~
>>>popは実装したところ効率が劣化したため保留。~
---
---
--pico16o.op1
---元は論理合成時に自動生成される、論理合成用スクリプト。~
---回路簡単化用モジュールを呼ばないことで速度をアップ。~
--pico16o.op2
---元は論理合成時に自動生成される、論理合成用スクリプトその2。~
---合成条件を設定できる。これをタイトにして性能向上を図る。~
-コンパイラ部
--picoc.h
---特に改良点無し。~
--picoc.l
---命令の追加。~
>回路部と共通。~
---現状特になし。意味ある解釈の厳密化を思いつけば。~
--picoc.y
---&color(red){構文木による定数畳み込み。};~
>即値ノード同士の演算時に値をまとめて一つの即値ノードとする((+12)を(3)に)~
>>'+'、'-'に%%加え無駄に'*'と'/'にも%%対応。%%'%'とかどうしよう。%%~
>>>定数を読むと畳み込み用ノードに入ってしまうため「定数 + 変数」な式が認識できない。~
>>>現状畳み込みはアセンブラ出力後にPerlで纏めている。~
---配列アドレス最適化。~
>感覚的に同上。~
>>a[n+3]のとき、aのインデックス値(=1)と+3をまとめてd[n]と認識させる。~
>>>添字の計算を「変数式」「変数式 + 定数」に限定したためyaccでやることが可能に。~
---
---
--picob.c
---%%&color(red){配列によるメモリ空間のトレースによる命令の最適化。};%%~
%%>完成すれば色々夢は広がるね。すればね。%%~
%%>>ループのような、アセンブラ出力時点で追えないものは不可。%%~
%%>>もし全て追えるなら、PPMMから比較加減算条件分岐と出来ることは多い。%%~
>>>つまり今回は何の役にも立たないと。~
---ロード命令最適化のためのレジスタテーブル。~
>このpico16oでは初期実装されてる模様。大和田さんありがとうございます。~
>>使われてない機能が有る。使いかたによっては化けるかも。~
>>>むしろバグった。真に使いたいなら自作の方がいいかもしれない。~
---インクリメント・デクリメント改良("++", "--", "+=", "-=")~
>加算値が定数で決まっているのでld→addではなくaddiで処理。~
>>"+=", "-=" は "=" の応用で実装。今回意味ないけど。~
>>>i++と++iの区別はしない、やらない。~
---変数&定数の式の最適化。~
>計算時に場合分け。~
>>p->opr[0].con.valueとかで即値読み出せば一手でaddiとかにいける。~
---%%比較命令の最適化。%%~
>%%`<',`>'の判定時、0 か 1 ではなく 0 か 0以外 に。ldliで1を用意しなくて済む分コスト減。%%~
---%%&color(red){ループアンローリング};。%%~
%%>変数回ループの展開なので全展開以外にいい案が浮かばない。%%~
%%>>全展開すればコードの肥満を代償にクロックを70%位まで落とせると判明。%%~
%%>>>ループ回数算出のためにはメモリマップが要る気がする。てか無いと回数判断用の値が手に入らないのでは。%%~
---%%&color(red){末尾再起展開};。%%~
%%>末尾再起の判定が多分キモ。%%~
%%>>判定自体は可能だが今のやりかただとゴチャい上に先に続かない感じ。%%~
%%>>下のopt_sem.plで同時に出来んかなー。%%~
>>>現状頓挫。~
---引数読み出しの最適化。~
%%>引数のスタック設置、利用時にSPを更新しないことで無駄なaddi,subiを抑制。%%~
%%>>このままだと関数の多重呼び出し時にちぬ。%%~
>引数ロード用命令追加で対応。~
---%%&color(red){分岐予測};。%%~
>分岐時のnopを回路内で吐いてるので弄り方が微妙。アセンブラソースでは見えないし。~
---%%&color(red){遅延スロット};。%%~
%%>分岐に依存しない命令を先のnopの位置に移動することで効率向上を目指す。%%~
%%>>構築設計論の最終課題でアセンブラ書いたときの苦労を機械まかせにしようという、%%~
%%>>>とりあえずはPerlでやってみようかの。%%~
>あまり効率に変化が無い割にコメントの扱いがダダダなので保留。~
---%%'*'とか'/'とか。%%~
%%>今回欠片も性能貢献しない。未公開プログラムでも活かされないこと必至。自己満足。%%~
%%>>'%'も作るべきか、否か、否かなぁ。%%~
---
--opt_sem.pl
---アセンブラソース最適化用に新規作成。アセンブラソース生成とpasmの間に置く。~
---%%&color(red){命令の実行順序最適化};%%~
%%>アセンブラ生成後、処理を並べ替える。%%~
%%>>Perlでの配列の任意位置への要素追加→spliceとか。~%%~
---即値命令の最適化~
>addi → subi とか来たら即値部分を計算して適した命令に置き換える。~
>>たぶん来ないけど連続ロードとかもこれで消せる。~
>>>つまりは除き穴的最適化用。~
-アセンブラ部
--pasm_parthenon.pl
---これは命令追加時以外いじらないことにした。
----
#comment
~
~
----
#comment
**おさらい:各ファイルの役割(Pico16o) [#lf86e358]
これでいいんだっけか。
-回路部
--pico16o.h
---主回路であるpico16o.sflのヘッダ。入出力線の宣言がされている。
--pico16o.sfl
---主回路。物理的(?)な回路記述は全てここ。記述設計は配線を変数感覚で出来るのがいいね。
-コンパイラ部
--picoc.h
---コンパイラは入力された文字列(プログラム)を細かく切り分け、その各欠片をノードとして構文木を作るのだがこのファイルはそのそのノードを定義している+α
--picoc.l
---文字列の解釈規則を定義。入力文字列はまずこのファイルでtokenというブロックに分割される。
--picoc.y
---構文の解釈規則を定義。pico.lで生成したtokenの並びからどういう処理をするのかを判断してそれに応じた構文木を作る。$xが持ってるのは全部ノードポインタ。定数計算などの簡単な処理はここでも出来る。
--picob.c
---picoc.yが作成した構文木からアセンブラを吐く。
-???部
--pasm_parthenon.pl
---詳しく見てないが、コンパイラの用意したアセンブラを解釈して回路が読むためのメモリを吐くらしい。
----
#comment
終了行:
[[吉田>吉田]]/[[覚書>吉田/覚書]]
>[[''グループD作業用ページ''>第14回ASICデザインコンテスト/作業用(五十嵐・吉田・矢吹)]]
#contents
で。
**現状の改良案、随時更新。 [#sc0f4021]
*''&color(red){赤字};は未実装''*
-回路部
--pico16o.h
---未定。~
--pico16o.sfl
---不要回路記述、不要命令の削除。~
---加算機の改良。
>並列プレフィクス加算機(APPNA)のHanCarlsonを導入。~
---パイプライン化。~
>段数は現在の2段で行く予定。~
---フォワーディング回路。~|4/4|r44|11,402|42.4|214|7,432|0.77(96.2%:2.98%)|しっかり論理合成 & ドキュメント改稿|
---
---命令追加(ldvl, stvl, &color(red){pop};, push)~---命令の追加。~|4/4|r44|11,402|42.4|214|7,432|0.77(96.2%:2.98%)|しっかり論理合成 & ドキュメント改稿|
>回路部と共通。~
>回路面積増加に見合うだけの効果があるか。~
>>ldvl,stvl:即値(インデックス)使用のロードストア。~
>>pop,push:スタック操作時のaddi,subi(というかPP,MM)を同時に行えるロードストア命令。~
>>>popは実装したところ効率が劣化したため保留。~
---
---
--pico16o.op1
---元は論理合成時に自動生成される、論理合成用スクリプト。~
---回路簡単化用モジュールを呼ばないことで速度をアップ。~
--pico16o.op2
---元は論理合成時に自動生成される、論理合成用スクリプトその2。~
---合成条件を設定できる。これをタイトにして性能向上を図る。~
-コンパイラ部
--picoc.h
---特に改良点無し。~
--picoc.l
---命令の追加。~
>回路部と共通。~
---現状特になし。意味ある解釈の厳密化を思いつけば。~
--picoc.y
---&color(red){構文木による定数畳み込み。};~
>即値ノード同士の演算時に値をまとめて一つの即値ノードとする((+12)を(3)に)~
>>'+'、'-'に%%加え無駄に'*'と'/'にも%%対応。%%'%'とかどうしよう。%%~
>>>定数を読むと畳み込み用ノードに入ってしまうため「定数 + 変数」な式が認識できない。~
>>>現状畳み込みはアセンブラ出力後にPerlで纏めている。~
---配列アドレス最適化。~
>感覚的に同上。~
>>a[n+3]のとき、aのインデックス値(=1)と+3をまとめてd[n]と認識させる。~
>>>添字の計算を「変数式」「変数式 + 定数」に限定したためyaccでやることが可能に。~
---
---
--picob.c
---%%&color(red){配列によるメモリ空間のトレースによる命令の最適化。};%%~
%%>完成すれば色々夢は広がるね。すればね。%%~
%%>>ループのような、アセンブラ出力時点で追えないものは不可。%%~
%%>>もし全て追えるなら、PPMMから比較加減算条件分岐と出来ることは多い。%%~
>>>つまり今回は何の役にも立たないと。~
---ロード命令最適化のためのレジスタテーブル。~
>このpico16oでは初期実装されてる模様。大和田さんありがとうございます。~
>>使われてない機能が有る。使いかたによっては化けるかも。~
>>>むしろバグった。真に使いたいなら自作の方がいいかもしれない。~
---インクリメント・デクリメント改良("++", "--", "+=", "-=")~
>加算値が定数で決まっているのでld→addではなくaddiで処理。~
>>"+=", "-=" は "=" の応用で実装。今回意味ないけど。~
>>>i++と++iの区別はしない、やらない。~
---変数&定数の式の最適化。~
>計算時に場合分け。~
>>p->opr[0].con.valueとかで即値読み出せば一手でaddiとかにいける。~
---%%比較命令の最適化。%%~
>%%`<',`>'の判定時、0 か 1 ではなく 0 か 0以外 に。ldliで1を用意しなくて済む分コスト減。%%~
---%%&color(red){ループアンローリング};。%%~
%%>変数回ループの展開なので全展開以外にいい案が浮かばない。%%~
%%>>全展開すればコードの肥満を代償にクロックを70%位まで落とせると判明。%%~
%%>>>ループ回数算出のためにはメモリマップが要る気がする。てか無いと回数判断用の値が手に入らないのでは。%%~
---%%&color(red){末尾再起展開};。%%~
%%>末尾再起の判定が多分キモ。%%~
%%>>判定自体は可能だが今のやりかただとゴチャい上に先に続かない感じ。%%~
%%>>下のopt_sem.plで同時に出来んかなー。%%~
>>>現状頓挫。~
---引数読み出しの最適化。~
%%>引数のスタック設置、利用時にSPを更新しないことで無駄なaddi,subiを抑制。%%~
%%>>このままだと関数の多重呼び出し時にちぬ。%%~
>引数ロード用命令追加で対応。~
---%%&color(red){分岐予測};。%%~
>分岐時のnopを回路内で吐いてるので弄り方が微妙。アセンブラソースでは見えないし。~
---%%&color(red){遅延スロット};。%%~
%%>分岐に依存しない命令を先のnopの位置に移動することで効率向上を目指す。%%~
%%>>構築設計論の最終課題でアセンブラ書いたときの苦労を機械まかせにしようという、%%~
%%>>>とりあえずはPerlでやってみようかの。%%~
>あまり効率に変化が無い割にコメントの扱いがダダダなので保留。~
---%%'*'とか'/'とか。%%~
%%>今回欠片も性能貢献しない。未公開プログラムでも活かされないこと必至。自己満足。%%~
%%>>'%'も作るべきか、否か、否かなぁ。%%~
---
--opt_sem.pl
---アセンブラソース最適化用に新規作成。アセンブラソース生成とpasmの間に置く。~
---%%&color(red){命令の実行順序最適化};%%~
%%>アセンブラ生成後、処理を並べ替える。%%~
%%>>Perlでの配列の任意位置への要素追加→spliceとか。~%%~
---即値命令の最適化~
>addi → subi とか来たら即値部分を計算して適した命令に置き換える。~
>>たぶん来ないけど連続ロードとかもこれで消せる。~
>>>つまりは除き穴的最適化用。~
-アセンブラ部
--pasm_parthenon.pl
---これは命令追加時以外いじらないことにした。
----
#comment
~
~
----
#comment
**おさらい:各ファイルの役割(Pico16o) [#lf86e358]
これでいいんだっけか。
-回路部
--pico16o.h
---主回路であるpico16o.sflのヘッダ。入出力線の宣言がされている。
--pico16o.sfl
---主回路。物理的(?)な回路記述は全てここ。記述設計は配線を変数感覚で出来るのがいいね。
-コンパイラ部
--picoc.h
---コンパイラは入力された文字列(プログラム)を細かく切り分け、その各欠片をノードとして構文木を作るのだがこのファイルはそのそのノードを定義している+α
--picoc.l
---文字列の解釈規則を定義。入力文字列はまずこのファイルでtokenというブロックに分割される。
--picoc.y
---構文の解釈規則を定義。pico.lで生成したtokenの並びからどういう処理をするのかを判断してそれに応じた構文木を作る。$xが持ってるのは全部ノードポインタ。定数計算などの簡単な処理はここでも出来る。
--picob.c
---picoc.yが作成した構文木からアセンブラを吐く。
-???部
--pasm_parthenon.pl
---詳しく見てないが、コンパイラの用意したアセンブラを解釈して回路が読むためのメモリを吐くらしい。
----
#comment
ページ名: