Mercurial > hg > Papers > 2021 > anatofuz-master
changeset 76:a438cbfd3593
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 04 Feb 2021 19:16:52 +0900 |
parents | d94a41940586 |
children | d50a39e6e6a7 |
files | paper/chapter/03-gears.tex paper/drawio/old_generate_context.drawio paper/drawio/old_generate_context.pdf paper/master_paper.pdf paper/src/queueTakeStub.cbc |
diffstat | 5 files changed, 42 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter/03-gears.tex Thu Feb 04 16:59:59 2021 +0900 +++ b/paper/chapter/03-gears.tex Thu Feb 04 19:16:52 2021 +0900 @@ -242,6 +242,7 @@ takeは出力を1つ出すCodeGearである為、継続で渡された\texttt{odgCommitCUDAWorker4}はStubでこの出力を受け取る。 \lstinputlisting[label=src:queueTake, caption=InterfaceのAPIの呼び出し]{src/queueTake.cbc} + \subsection{Interfaceのメタレベルの実装} Interface自身もDataGearであり、実際の定義はcontextのunion Data型に記述されている。 メタレベルではIntefaceのDataGearのGearsOS上の実装である構造体自身にアクセス可能である。 @@ -266,10 +267,22 @@ newはGearsOSのビルド時にPerlスクリプトによって、contextが持つDataGearのヒープ領域の操作のマクロに切り替わる。 ノーマルレベルではcontextにアクセスできないので、 Javaの様なアロケーションのシンタックスを導入している。 +\subsection{goto時のContextとInterfaceの関係} +Interfaceはモジュール化の仕組みとしてでなく、 メタレベルでは一時的な変数の置き場所としても利用している。 +ソースコード\ref{src:queueTake}で呼び出しているtakeは、 OutputDataGearがあるAPIである。 +このOutputDataGearは、 context内のDataGearの置き場所であるdata配列の、 Interfaceのデータ格納場所に書き込まれる。 +OutputDataGearを取得する場合は、 継続先でなく、APIのInterfaceから取得しないといけない。 -Interfaceで定義したCodeGearの出力は必ずDataGearでなければならない。 -OutputDataGear自体はInteface自身のDataGearにメタレベルで書き込まれる。 - +また、goto文で別のCodeGearに遷移する際も、引数情報を継続先のcontextのdata配列の場所に書き込む必要がある。 +この処理はメタレベルの計算であるため、 GearsOSのビルド時にPerlで変換される。 +ソースコード\ref{src:takeStub}にソースコード\ref{src:queueTake}の変換結果を示す。 +この例ではStubCodeGearのディスパッチを行う\texttt{\_\_code meta}へのgotoの前に、Gearefマクロを使ったcontextへの書き戻しが行われている。 +GearsOSはCbCを用いて実装している為、スタックを持っていない。 +その為都度データはContextに書き戻す必要があるが、データの一時保管場所としても利用されている。 +\lstinputlisting[label=src:takeStub, caption=takeを呼び出す部分の変換後]{src/queueTakeStub.cbc} +この性質からInterfaceには、Interfaceを実装するDataGearが持っておきたい変数はいれてはいけない。 +例えばQueueの実装では先頭要素を指し示す情報が必要であるが、 これをInterface側のDataGearにしてしまうと、 呼び出し時に毎回更新されてしまう。 +常に持っておきたい値は、 Impl側のDataGearの要素として定義する必要がある。 \section{GearsOSのビルドシステム} GearsOSではビルドツールにCMakeを利用している。 @@ -308,6 +321,11 @@ その為GearsOSの拡張部分を、等価な純粋なCbCの記述に変換する必要がある。 現在のGearsOSでは、 CMakeによるコンパイル時にPerlで記述された\texttt{generate\_stub.pl}と\texttt{generate\_context.pl}の2種類のスクリプトで変換される。 +これらのPerlスクリプトはプログラマが自分で動かすことはない。 +Perlスクリプトの実行手順はCMakeLists.txtに記述しており、 makeやninja-buildでのビルド時に呼び出される。(ソースコード \ref{src:cmake1}) + +\lstinputlisting[label=src:cmake1, caption=CMakeList.txt内でのPerlの実行部分]{src/cmakefile.1.txt} + \section{generate\_stub.pl} generate\_stub.plは各CbCファイルごとに呼び出される。 入力としてCbCファイルを受け取りメタ計算を含んだ形に変換し、 純粋なCbCファイルとして書き出す。 @@ -322,33 +340,27 @@ \end{figure} \section{generate\_context.pl} - +generate\_context.plは、Contextの初期化関連のファイルを生成するPerlスクリプトである。 +Contextを初期化するためには、下記の処理をしなければならない。 \begin{itemize} - \item \texttt{generate\_stub.pl} - \begin{itemize} - \item 各CbCファイルごとに呼び出されるスクリプト - \item 対応するメタ計算を導入したCbCファイル(拡張子はc)に変換する - \end{itemize} - \item \texttt{generate\_context.pl} - \begin{itemize} - \item 生成したCbCファイルを解析し、使われているCodeGearを確定する - \item context.hを読み込み、使われているDataGearを確定する - \item Context関係の初期化ルーチンやCodeGear、 DataGearの番号であるenumを生成する - \begin{itemize} - \item 図\ref{fig:generate_context_1}に処理の概要を示す - \end{itemize} - \end{itemize} + \item CodeGearのリストにStubCodeGearのアドレスの代入 + \item goto meta時に引数を格納するdata配列のアロケーション + \item 計算で使用するすべてのDataGear、CodeGearに対して番号を割り振り、 enumを作製する + \item コンストラクタ関数のexternの生成 \end{itemize} -これらのPerlスクリプトはプログラマが自分で動かすことはない。 -Perlスクリプトの実行手順はCMakeLists.txtに記述しており、 makeやninja-buildでのビルド時に呼び出される。(ソースコード \ref{src:cmake1}) +これらの記述は煩雑であるものの、CbCファイルとDataGearの情報が纏められたcontext.hを見れば、記述すべき内容は一意に決定でき為、自動化が可能である。 +generate\_context.plは、 context.hを読み、まずDataGearの取得を行う。 +CodeGearは、generate\_stub.plで変換されたCbCファイルを読み込み、 \texttt{\_\_code}があるものをCodeGearとして判断する。 +また、Cの一般関数でも\texttt{create}が関数名に含まれており、 ポインタ型を返す関数はInterfaceのコンストラクタとして判断する。 +これらの情報をもとに、 CodeGear、DataGearの番号を作製し、enumCode.hとenumData.hとして書き出す。 -\lstinputlisting[label=src:cmake1, caption=CMakeList.txt内でのPerlの実行部分]{src/cmakefile.1.txt} + \begin{figure}[h] \begin{center} - \includegraphics[width=130mm]{drawio/old_generate_context.pdf} + \includegraphics[width=90mm]{drawio/old_generate_context.pdf} \end{center} \caption{generate\_context.plを使ったファイル生成} \label{fig:generate_context_1}
--- a/paper/drawio/old_generate_context.drawio Thu Feb 04 16:59:59 2021 +0900 +++ b/paper/drawio/old_generate_context.drawio Thu Feb 04 19:16:52 2021 +0900 @@ -1,1 +1,1 @@ -<mxfile host="Electron" modified="2021-01-31T06:44:41.778Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/14.1.8 Chrome/87.0.4280.88 Electron/11.1.1 Safari/537.36" etag="9FHBlLaFidBkxVh0QJgQ" version="14.1.8" type="device"><diagram id="zeS24BvXJpr6MH4-GfYa" name="ページ1">5Vlbb9owFP41SOukojg3wiOlbHvY1kpI2/pUuYmbeJg4c5wS9utnxw65kQ4KiLV7Iv7O8e2c4+9zwsCaLvOPDCbRFxogMjCNIB9Y1wPTBAawxI9E1grxvJECQoYD7VQBc/wblT01muEApQ1HTinhOGmCPo1j5PMGBhmjq6bbIyXNWRMYog4w9yHpot9xwCO9C3NU4Z8QDqNyZuCOlWUJS2e9kzSCAV3VIGs2sKaMUq6elvkUERm8Mi6q34ce62ZhDMV8lw7jb/fzkWUaXvj1aZ6nCy+a3V2aem18XW4YBWL/ukkZj2hIY0hmFXrFaBYHSI5qiFbl85nSRIBAgD8R52udTJhxKqCIL4m2ohzzH7L70NGtu5rlOtcjF411rXGLGF4ijpjGHjEhU0ooK1ZuWZZhgInAU87oYpMuSyBql3JrjeClNGM+eiY8ung5ZCHiz/iBUTcbYJNjcTgQFQtna+HCEIEcPzUXAnWVhhs/3XXCGFzXHBKKY57WRr6VgHDQB84e62rTx812W0Wxn794UCsoW7WtVFBRaHsUnY7qEySZDkOnCsVhSeRjTLksuVWEOZonsEjWSjBNs6AeoL8Ii7K8yTjBMdJ4ANniRvTCvCijoeFsauEJMY7yQd9R6kme7mA5zaiJwlPtVUURoGSwqE4POrxbE14L+v4xtV99TM1WTK2zx9TZElOXcMk8tDhEVXDdXxktDZdpQXwT4QC8JK+M4imUv7cZQ8I4fZhKRcJiCD3sAytd3r0f+iUq1q7mU6aL15ZYo5XY0dkTu+H/88heTfQ2OieDJaNQk71xqY5t3evqm0gFWytJNYQWaaCYYOg6bglU0lq01vVWe5IeyezkfQcVBfZeMnqoZnZEznObFei0C0stTPeqamtf8XVMuzGPC54XX6e1rn39bc87vViDbcqiiClNYPxyFhQ3dkEqfBjVeE6NqOyvjOZs0Ey+Y56f5uxz0hzoo7nu3X7DXk3mcl7CW11yDGAaFRsCR6a10Y60pu5iB9DaYVXg/CtV8Jc3vDdeBcA7ZxWUyzz6ZTZEMWKQo/uSzxPSc3HtliEhOEl34HKYJurbziPOZQ6Pwdej0Q7XUm8bX3un4mtVISeQWhRny/5XDWmd0gBVSlwZpe0acjiMLrrGtyHcwACt6+H53zzB+ODTKkKwpRJwnGR81/Mpj3MzN4pWy29uMZXJaXyG0xAkOIxF0xc5kJx8JTOEfUgm2rDEQUD6iqEpPkdIsdM66/a2u5m7JcPmya5mxokSTDP+P2bYa7M5OHuGzRORuX+JcrhMCKq+EL15SrbsE1KyaFb/wqjX5uq/LGv2Bw==</diagram></mxfile> \ No newline at end of file +<mxfile host="Electron" modified="2021-02-04T09:34:16.318Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/14.1.8 Chrome/87.0.4280.88 Electron/11.1.1 Safari/537.36" etag="Oe_7ax2ecof2tKLrGQMp" version="14.1.8" type="device"><diagram id="zeS24BvXJpr6MH4-GfYa" name="ページ1">7VrtbpswFH2aSNukRHxDfqZp1k7auk6RunZ/Khcc8OrYzJiE7OlnwARISJU0TVLaSZHCPb42+J77YRs6+nCaXDAQBt+oB3FHU7yko593NE01NK2T/hRvkSNO38oBnyFPKpXAGP2FElQkGiMPRjVFTinmKKyDLiUEuryGAcbovK42obh+1xD4cA0YuwCvoz+RxwM5C80u8UuI/KC4s2r185YpKJTlTKIAeHRegfRRRx8ySnl+NU2GEKfGK+yS9/u8oXX5YAwSvk2H/s392NY1xfGvZuMkenSC0V1XshPxRTFh6In5S5EyHlCfEoBHJXrGaEw8mI6qCKnU+UppKEBVgL8h5wtJJog5FVDAp1i2wgTx27R7z5TSXaXlPJEjZ8KiIlxDhqaQQyaxCcJ4SDFl2ZPruq4o6kDgEWf0cUmXLpB1W0nzRTRmLnzCQLr0OcB8yJ/QU6VDpOar3EFScQGpeHC2EAoMYsDRrO5eQHqpv9STXQeMgUVFIaSI8Kgy8nUKCAUZcEZfepsMN8NacYrd9MVF/gSFVJlKCWWOtoPTSZvOAI6lGda8UARLmF4SylOXmweIw3EIMqrmItPUHeoBuI9+5pbfY44RgRL3AHv8LnohnrlRTzF3844ZZBwmT9IpW3WzbkfdMHN5XiYNtchpQTVhSIM3ukCFht2tbLxBK2srVrZPbmWzwcoW5ml2olmglea2/sS0aOhGWXIcCAXVCZOyUVz56f91zKBoHD4M06qFxBBy2AdWqHz41HMLVDx7fr+86WP7qVZWEpN6TKotY36jjvjlj9FMu/qVzOcT/7arrhn1mLWyUinLurl9rdxE0kq9el6RVI2dquQeRXGvWFWbUmIeP1EIyPODVSw+hVvzXlAJx3zEvL310Wg7K4m3kE8XjWZrVq5ETPe2KtxVhayTUYq1bseNYnvLKM5XEkeI4kbirfYR3zPEfnEj+a3iXnVOyb3dQu7N9jHfaPuTBr3TFuJfB1f6Kbnqt4WrNxikxknX1/bG9fV+m2EfEsgAh/fFQjvEGza+666HMQqjLRbZIArz8+MJSlJHPMxC2lw5JzKbFtJO00LaOdQJhuocaFcESTwdUg+W26Ly7OKtbpSWxxTF6w7zmBulZn77e0elMEoDv4iEMd82DtOwrZOV2784vyc0Zat2pC8hgJFPhOgKVtJse5aygVyAB7JhijwPb/KOemE5TEzbK0dVWgPnVgPn2qEoLwZ+ccppzP9znhXflTxuWyfnXDtUGk/ANMSwW9Re9/1kc00/ZTbfvAs7ULE+Bxy0rFivcdnA+ObE7bw6eptejb5MEIs8St4Tubb96sg91OsHT8TtOrEXELAvBLUtYe9Fet88IulCLL/eyb+NKL+B0kf/AA==</diagram></mxfile> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/queueTakeStub.cbc Thu Feb 04 19:16:52 2021 +0900 @@ -0,0 +1,7 @@ +__code odgCommitCPUWorker3(struct Context *context,struct CPUWorker* worker, struct Context* task) { + int i = worker->loopCounter; + struct Queue* queue = GET_WAIT_LIST(task->data[task->odg+i]); + Gearef(context, Queue)->queue = (union Data*) queue; + Gearef(context, Queue)->next = C_odgCommitCPUWorker4; + goto meta(context, queue->take); +}