Mercurial > hg > Papers > 2021 > anatofuz-master
changeset 95:92a1eb7a314c
update
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 05 Feb 2021 21:14:57 +0900 |
parents | d4b5c1b2925f |
children | 608fc88aeca6 |
files | paper/chapter/05-perl.tex paper/master_paper.pdf paper/src/StackTestArg.cbc paper/src/afterGmain.cbc paper/src/ppGmain.cbc |
diffstat | 5 files changed, 125 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/paper/chapter/05-perl.tex Fri Feb 05 20:32:25 2021 +0900 +++ b/paper/chapter/05-perl.tex Fri Feb 05 21:14:57 2021 +0900 @@ -344,4 +344,28 @@ この特殊変数は、特殊変数を呼び出したPerlの行番号が取得できるメタAPIである。 \lstinputlisting[label=src:debugPrint, caption=debug\_print]{src/debugPrint.pl} -\lstinputlisting[label=src:callDebugPrint, caption=debug\_printの呼び出し]{src/callDebugPrint.pl} \ No newline at end of file +\lstinputlisting[label=src:callDebugPrint, caption=debug\_printの呼び出し]{src/callDebugPrint.pl} + + + +\section{GearsOS初期化コードの自動生成} +GearsOSでは、TaskManagerやWorker、Contextの初期化を起動時に行わなければならない。 +GearsOSの例題では、これらの初期化関数や、初期化に関連するCodeGearはほぼ共通であった。 + +新しい例題を実装する際に、これらの初期化ルーチンを毎回コピー\&ペーストし、実際に記述したい箇所を変更するという手法がとられていた。 +この初期化ルーチンも一種のメタ的な操作であるために、ユーザーから分離させたい。 +そこで自動で初期化ルーチンを作製する、特殊なCodeGearの定義である\texttt{gmain}を定義した。 + +gmainで定義したmainファイルをソースコード\ref{src:gmainExample}に示す。 +gmainを使用するCbCファイルは、 他のファイルと変わらずに、 Interfaceを使う場合は\texttt{\#interface}構文で呼び出す。 +通常と異なるのは、 GearsOSを停止させるCodeGearとしてshutdownがAPIとして定義されている。 +gotoで継続するCodeGearの引数として、このshutdownを渡すと、最後にGearsOSの終了ルーチンに継続するようになる。 +これをmain.cbcとして定義する。 +\lstinputlisting[label=src:gmainExapmle, caption=gmainを使ったMainCodeGear定義]{src/ppGmain.cbc} + +generate\_stub.plで、main.cbcを変換した後をソースコード\ref{src:afterGmain}に示す。 +\lstinputlisting[label=src:afterGmain, caption=gmain定義の変換後のCbC Code]{src/afterGmain.cbc} +変換した結果では、 コマンドライン引数でGearsOSのWorkerの数などを指定できる関数initや、 TaskManagerの初期化を行うinitDataGears、GearsOSを終了するCodeGearであるshutdownなどが生成される。 +gmainのスコープの中に記述したものは、createTaskの中に移動される。 +createTaskでは、GearsOSの起動に必要なTaskManagerなどの引数が受け渡されるようになっている。 +これによってGearsOSの例題を実装する際に、考慮しなければいけない煩雑な設定を緩和することが可能となった。 \ No newline at end of file
--- a/paper/src/StackTestArg.cbc Fri Feb 05 20:32:25 2021 +0900 +++ b/paper/src/StackTestArg.cbc Fri Feb 05 21:14:57 2021 +0900 @@ -1,5 +1,3 @@ -__code gmain(){ - Stack* stack = createSingleLinkedStack(context); - StackTest* stackTest = createStackTestImpl3(context); - goto stackTest->insertTest1(shutdown); -} +Stack* stack = createSingleLinkedStack(context); +StackTest* stackTest = createStackTestImpl3(context); +goto stackTest->insertTest1(shutdown);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/afterGmain.cbc Fri Feb 05 21:14:57 2021 +0900 @@ -0,0 +1,88 @@ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <unistd.h> +#include <unistd.h> +#include "../../../context.h" + +int cpu_num = 1; +int length = 102400; +int split = 8; +int* array_ptr; +int gpu_num = 0; +int CPU_ANY = -1; +int CPU_CUDA = -1; + +__code initDataGears(struct Context *context,struct LoopCounter* loopCounter, struct TaskManager* taskManager) { + loopCounter->i = 0; + taskManager->taskManager = (union Data*)createTaskManagerImpl(context, cpu_num, gpu_num, 0); + goto meta(context, C_prevTask); +} + +__code initDataGears_stub(struct Context* context) { + LoopCounter* loopCounter = Gearef(context, LoopCounter); + TaskManager* taskManager = Gearef(context, TaskManager); + goto initDataGears(context, loopCounter, taskManager); +} + +__code prevTask(struct Context *context,struct LoopCounter* loopCounter) { + goto meta(context, C_createTask); +} + + +__code prevTask_stub(struct Context* context) { + LoopCounter* loopCounter = Gearef(context, LoopCounter); + goto prevTask(context, loopCounter); +} + +__code createTask(struct Context *context,struct LoopCounter* loopCounter, struct TaskManager* taskManager) { + Stack* stack = createSingleLinkedStack(context); + StackTest* stackTest = createStackTestImpl3(context); + Gearef(context, StackTest)->stackTest = (union Data*) stackTest; + Gearef(context, StackTest)->stack = stack; + Gearef(context, StackTest)->next = C_shutdown; + goto meta(context, stackTest->insertTest1); +} + +__code createTask_stub(struct Context* context) { + LoopCounter* loopCounter = Gearef(context, LoopCounter); + TaskManager* taskManager = Gearef(context, TaskManager); + goto createTask(context, loopCounter, taskManager); +} + +__code shutdown(struct Context *context,struct TaskManager* taskManager) { + Gearef(context, TaskManager)->taskManager = (union Data*) taskManager; + Gearef(context, TaskManager)->next = C_exit_code; + goto meta(context, taskManager->shutdown); +} + +__code shutdown_stub(struct Context* context) { + goto shutdown(context, &Gearef(context, TaskManager)->taskManager->TaskManager); +} + + + +void init(int argc, char** argv) { + for (int i = 1; argv[i]; ++i) { + if (strcmp(argv[i], "-cpu") == 0) + cpu_num = (int)atoi(argv[i+1]); + else if (strcmp(argv[i], "-l") == 0) + length = (int)atoi(argv[i+1]); + else if (strcmp(argv[i], "-s") == 0) + split = (int)atoi(argv[i+1]); + else if (strcmp(argv[i], "-cuda") == 0) { + gpu_num = 1; + CPU_CUDA = 0; + } + } +} + +int main(int argc, char** argv) { + init(argc, argv); + struct Context* main_context = NEW(struct Context); + initContext(main_context); + main_context->next = C_initDataGears; + goto start_code(main_context); +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/src/ppGmain.cbc Fri Feb 05 21:14:57 2021 +0900 @@ -0,0 +1,9 @@ +#interface "Stack.h" +#interface "StackTest.h" + +__code gmain(){ + Stack* stack = createSingleLinkedStack(context); + StackTest* stackTest = createStackTestImpl3(context); + goto stackTest->insertTest1(stack, shutdown); +} +