Gears OS のモジュール化と並列 API

Mitsuki Miyagi, Yu Tobaru, Shinji Kono 琉球大学

Gears OS

スライドの流れ

Gears OS での形式化とInterfaceの導入

Gears OS の Interface

スライドの流れ

並列API

スライドの流れ

CbC

CbC

CbC の構文

__code cg0(int a, int b) {
    goto cg1(a+b);
}
__code cg1(int c) {
    goto cg2(c);
}

スライドの流れ

Gears における並列実行

Meta Data Gear と Meta Code Gear

Gears OS の構造

Gears OS の構造

Context

Gears OS の構造

TaskManager

Gears OS の構造

Worker

Gears OS の構造

1つの Code Gear の実行は他の Code Gear に割り込まれない

Gears OS の構造

par goto

__code code1(Integer *integer1, Integer * integer2, Integer *output) {
    par goto add(integer1, integer2, output, __exit);
    goto code2();
}

Perl スクリプトによる Meta Data Gear の生成

__code code1(struct Context *context, Integer *integer1, Integer *integer2, Integer *output) {
    // create context
    context->task = NEW(struct Context);
    initContext(context->task);

    // set task parameter
    context->task->next = C_add;
    context->task->idgCount = 2;
    context->task->idg = context->task->dataNum;
    context->task->maxIdg = context->task->idg + 2;
    context->task->odg = context->task->maxIdg;
    context->task->maxOdg = context->task->odg + 1;
...
    // set TaskManager->spawns parameter
    Gearef(context, TaskManager)->taskList = context->taskList;
    Gearef(context, TaskManager)->next1 = C_code2;
    goto parGotoMeta(context, C_code2);
}

スライドの流れ

Gears OS の評価(目的)

Gears OS の評価(環境)

Twice

Processor Time(ms)
1 CPU 1181.215
2 CPUs 627.914
4 CPUs 324.059
8 CPUs 159.932
16 CPUs 85.518
32 CPUs 43.496
GPU 127.018
GPU(kernel only) 6.018

評価の考察

Processor Time(ms)
1 CPU 1181.215
2 CPUs 627.914
4 CPUs 324.059
8 CPUs 159.932
16 CPUs 85.518
32 CPUs 43.496
GPU 127.018
GPU(kernel only) 6.018

Go 言語との比較

Goとの比較

スライドの流れ

スライドの流れ

今後の課題

Perlスクリプトによる変換

__code code1(struct Context *context, Integer *integer1, Integer *integer2, Integer *output) {
    // create context
    context->task = NEW(struct Context);
    initContext(context->task);

    // set task parameter
    context->task->next = C_add;
    context->task->idgCount = 2;
    context->task->idg = context->task->dataNum;
    context->task->maxIdg = context->task->idg + 2;
    context->task->odg = context->task->maxIdg;
    context->task->maxOdg = context->task->odg + 1;

    // create Data Gear Queue
    GET_META(integer1)->wait = createSynchronizedQueue(context);
    GET_META(integer2)->wait = createSynchronizedQueue(context);
    GET_META(integer3)->wait = createSynchronizedQueue(context);

    // set Input Data Gear
    context->task->data[context->task->idg+0] = (union Data*)integer1;
    context->task->data[context->task->idg+1] = (union Data*)integer2;

    // set Output Data Gear
    context->task->data[context->task->odg+0] = (union Data*)integer3;

    // add taskList Element
    struct Element* element;
    element = &ALLOCATE(context, Element)->Element;
    element->data = (union Data*)context->task;
    element->next = context->taskList;
    context->taskList = element;
    
    // set TaskManager->spawns parameter
    Gearef(context, TaskManager)->taskList = context->taskList;
    Gearef(context, TaskManager)->next1 = C_code2;
    goto meta(context, C_code2);
}