Mercurial > hg > Members > kono > Cerium
view TaskManager/Test/Sum/main.cpp @ 14:41ccd4b38184
*** empty log message ***
author | gongo |
---|---|
date | Fri, 08 Feb 2008 18:00:21 +0900 |
parents | 7aa4c006e4be |
children | b59d134a81a7 |
line wrap: on
line source
#include <stdio.h> #include <string.h> #include "TaskManager.h" #define MAX 1024 TaskManager *manager; //SymTable *TaskManager::symtb; int add(void*, void*); int sub(void*, void*); int mul(void*, void*); int div(void*, void*); int sum(void*, void*); int sum2(void*, void*); int data[MAX] __attribute__((aligned(16))); int buff[MAX] __attribute__((aligned(16))); int out[MAX] __attribute__((aligned(16))); int add(void *wbuf, void *rbuf) { int *ret = (int*)wbuf; int *data = (int*)rbuf; *ret = data[0] + data[1]; return sizeof(int); } int sub(void *wbuf, void *rbuf) { int *ret = (int*)wbuf; int *data = (int*)rbuf; *ret = data[0]-data[1]; return sizeof(int); } int mul(void *wbuf, void *rbuf) { int *ret = (int*)wbuf; int *data = (int*)rbuf; *ret = data[0]*data[1]; return sizeof(int); } int Div(void *wbuf, void *rbuf) { int *ret = (int*)wbuf; int *data = (int*)rbuf; *ret = data[0]/data[1]; return sizeof(int); } int sum(void *wbuf, void *rbuf) { int *ret = (int*)wbuf; int *data = (int*)rbuf; int i; *ret = 0; for (i = 0; i < 16; i++) { *ret += data[i]; } return sizeof(int); } int sum2(void *wbuf, void *rbuf) { int *ret = (int*)wbuf; int *data = (int*)rbuf; int i; *ret = 0; for (i = 0; i < 64; i++) { *ret += data[i*4]; } return sizeof(int); } int init2(void *w, void *r) { int i, fd; int div = MAX/16; HTaskPtr *task = new HTaskPtr[div]; HTaskPtr last; for (i = 0; i < MAX; i++) { data[i] = i; } memset(buff, 0, sizeof(int)*1024); memset(out, 0, sizeof(int)*1024); fd = manager->open("Sum"); for (i = 0; i < div; i++) { task[i] = manager->create_task(fd, sizeof(int)*16, (unsigned int)&data[i*16], (unsigned int)&buff[i*4], NULL); } fd = manager->open("Sum2"); last = manager->create_task(fd, sizeof(int)*256, (unsigned int)buff, (unsigned int)&out[0], NULL); #if 0 for (i = 0; i < div-1; i++) { manager->set_task_depend(task[i], task[i+1]); } manager->set_task_depend(task[div-1], last); for (i = 0; i < div; i++) { manager->run_task(task[i]); } manager->run_task(last); #else for (i = 0; i < div; i++) { manager->set_task_depend(task[i], last); } for (i = 0; i < div; i++) { manager->run_task(task[i]); } manager->run_task(last); #endif manager->run(); return 0; } int result(void *w, void *r) { printf("manager : %d\n", out[0]); out[0] = 0; for (int i = 0; i < MAX; i++) { out[0] += i; } printf("for : %d\n", out[0]); return 0; } int init(void *w, void *r) { HTaskPtr init_task, finish_task; int fd; fd = manager->open("Init2"); init_task = manager->create_task(fd, 0, 0, 0, NULL); manager->run_task(init_task); fd = manager->open("Result"); finish_task = manager->create_task(fd, 0, 0, 0, NULL); manager->set_task_depend(init_task, finish_task); manager->run_task(finish_task); return 0; } int main(void) { manager = new TaskManager(1); manager->init(); // 本当は、ここは user 側で書かない // 設定ファイルかなにかで読むとか?違うな manager->set_symbol("Init", (void*)init); manager->set_symbol("Init2", (void*)init2); manager->set_symbol("Result", (void*)result); manager->set_symbol("Sum", (void*)sum); manager->set_symbol("Sum2", (void*)sum2); manager->set_init_task("Init"); manager->run(); return 0; }