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;
}