# HG changeset patch # User gongo # Date 1203072984 -32400 # Node ID e198c3e01cecd3c103356179bd61cf5905c7fe4c # Parent c964110017c8001fb211cf1a96c680ac2451197b spe ¤«¤é scheduler ¤Ã¤Æ¥Ç¥£¥ì¥¯¥È¥ê¤Ë°Ü¤ê¤Þ¤¹ diff -r c964110017c8 -r e198c3e01cec TaskManager/kernel/spe/SpeExit.cc --- a/TaskManager/kernel/spe/SpeExit.cc Fri Feb 15 19:44:23 2008 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -#include -#include "SpeExit.h" -#include "error.h" - -SpeTaskBase* -SpeExit::next(SpeManager *m, SpeTaskBase *p) -{ - delete p; - - __debug("SpeExit::next()\n"); - - return NULL; -} diff -r c964110017c8 -r e198c3e01cec TaskManager/kernel/spe/SpeMail.cc --- a/TaskManager/kernel/spe/SpeMail.cc Fri Feb 15 19:44:23 2008 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -#include -#include "SpeMail.h" -#include "SpeTaskList.h" -#include "SpeExit.h" -#include "error.h" - -SpeMail::SpeMail(DmaManager *cn) -{ - connector = cn; -} - -void -SpeMail::read(void) -{ - - __debug("[SpeMail:%s]\n", __FUNCTION__); - - params_addr = connector->mail_read(); - - __debug(" params_addr = 0x%x\n", params_addr); -} - -SpeTaskBase* -SpeMail::next(SpeManager *m, SpeTaskBase *p) -{ - delete p; - - __debug("[SpeMail:%s]\n", __FUNCTION__); - - // if ʸ¤Ê¤¯¤¹¤Ë¤Ï¡¦¡¦¡¦´Ø¿ô¥Ý¥¤¥ó¥¿¡© - if ((int)params_addr == MY_SPE_COMMAND_EXIT) { - return new SpeExit(); - } else { - return new SpeTaskList(params_addr, m->get_curListBuf(), connector); - } -} diff -r c964110017c8 -r e198c3e01cec TaskManager/kernel/spe/SpeManager.cc --- a/TaskManager/kernel/spe/SpeManager.cc Fri Feb 15 19:44:23 2008 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,120 +0,0 @@ -#include -#include - -// ÀäÂÐ Fix me -// memalign ¤Î¤¿¤á¤Ë¤³¤ó¤Ê¤³¤È¤Ë¡¦¡¦¡¦ -// ¤³¤³¤â¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤ä¤ë¤Ù¤­¤À¤è¤Ê¡¼ -#ifdef CELL -# include -#else -# include -# include -#endif - -#include "SpeManager.h" -#include "SpeNop.h" -#include "error.h" - -SpeManager::SpeManager(void) -{ -} - -void -SpeManager::init(void) -{ - int i; - - /** - * memalign ¤À¤È¡¢¤Ê¤¼¤«Æ±¤¸¥¢¥É¥ì¥¹¤·¤«µ¢¤Ã¤Æ¤³¤Ê¤¤¤¢¤²¤¯ - * task3->exec ¤Î¤È¤³¤í¤Ç¡¢ _start ¤ËÈô¤ó¤ÇºÇ½é¤«¤é¤Ë¤Ê¤Ã¤Æ - * ¤À¤±¤É¥ë¡¼¥×¤·¤Ê¤¯¤Æ»ß¤Þ¤ë¤È¤«¤è¤¯¤ï¤«¤é¤ó - * - * new ¤¹¤ê¤ã¤¢Âç¾æÉפäݤ¤¡£¤¬¡¢¥¢¥é¥¤¥á¥ó¥È±¾¡¹¤Ç - * ºÇ°­¤Ç¤â readBuf ¤ä writeBuf ¤Ï memalign ¤Ç¤·¤¿¤¤¤ó¤À¤±¤É¤É¤¦¤·¤Æ¡© - * - * Äɵ­ - * ¥¢¥é¥¤¥á¥ó¥È¤ò128¤¸¤ã¤Ê¤¯¤Æ16¤Ë¤·¤¿¤éÄ̤ä¿¡£ - * ppe¦¤â128¤Ë¤·¤Æ¤ë¤ó¤À¤±¤É¤Ê¡¼ - * 128¤Ë¤·¤¿¤»¤¤¤Ç¡¢¤É¤Ã¤«¥µ¥¤¥º¤º¤ì¤¿¡© - */ - - for (i = 0; i < 2; i++) { -#ifdef CELL - listBuf[i] = - (TaskListPtr)memalign(DEFAULT_ALIGNMENT, sizeof(TaskList)); - readBuf[i] = memalign(DEFAULT_ALIGNMENT, 4*1024); - writeBuf[i] = memalign(DEFAULT_ALIGNMENT, 4*1024); -#else - listBuf[i] = (TaskListPtr)malloc(sizeof(TaskList)); - readBuf[i] = malloc(16*1024); - writeBuf[i] = malloc(16*1024); -#endif - } - listBufFlg = 0; - readBufFlg = 0; - writeBufFlg = 0; - - task1 = new SpeNop(); - task2 = new SpeNop(); - task3 = new SpeNop(); -} - -void -SpeManager::set_connect(DmaManager* cn) -{ - connector = cn; -} - -void -SpeManager::run(void) -{ - SpeTaskBase* taskTmp; - - // main loop - do { - __debug("----------\n"); - task3->write(); - task2->exec(); - task1->read(); - - taskTmp = task3; - task3 = task2; - task2 = task1; - task1 = task1->next(this, taskTmp); - } while (task1); - - delete task3; - delete task2; -} - -void -SpeManager::finish(void) -{ - free(listBuf[0]); - free(listBuf[1]); - free(readBuf[0]); - free(readBuf[1]); - free(writeBuf[0]); - free(writeBuf[1]); -} - -TaskListPtr -SpeManager::get_curListBuf(void) -{ - listBufFlg ^= 1; - return listBuf[listBufFlg]; -} - -void* -SpeManager::get_curReadBuf(void) -{ - readBufFlg ^= 1; - return readBuf[readBufFlg]; -} - -void* -SpeManager::get_curWriteBuf(void) -{ - writeBufFlg ^= 1; - return writeBuf[writeBufFlg]; -} diff -r c964110017c8 -r e198c3e01cec TaskManager/kernel/spe/SpeNop.cc --- a/TaskManager/kernel/spe/SpeNop.cc Fri Feb 15 19:44:23 2008 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -#include -#include "SpeNop.h" -#include "SpeMail.h" -#include "error.h" - -SpeTaskBase* -SpeNop::next(SpeManager *m, SpeTaskBase *p) -{ - __debug("SpeNop::next()"); - - delete p; - - return new SpeMail(m->connector); -} diff -r c964110017c8 -r e198c3e01cec TaskManager/kernel/spe/SpeNop2Ready.cc --- a/TaskManager/kernel/spe/SpeNop2Ready.cc Fri Feb 15 19:44:23 2008 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -#include -#include "SpeNop2Ready.h" -#include "SpeMail.h" -#include "error.h" - -SpeNop2Ready::SpeNop2Ready(DmaManager *cn) -{ - connector = cn; -} - -void -SpeNop2Ready::exec(void) -{ - __debug("[SpeNop2Ready:%s]\n", __FUNCTION__); - - connector->mail_write(MY_SPE_STATUS_READY); -} - -SpeTaskBase* -SpeNop2Ready::next(SpeManager *m, SpeTaskBase *p) -{ - __debug("[SpeNop2Ready:%s]\n", __FUNCTION__); - - delete p; - - return new SpeMail(connector); -} diff -r c964110017c8 -r e198c3e01cec TaskManager/kernel/spe/SpeTask.cc --- a/TaskManager/kernel/spe/SpeTask.cc Fri Feb 15 19:44:23 2008 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,102 +0,0 @@ -#include -#include "SpeTask.h" -#include "SpeTaskList.h" -#include "SpeNop2Ready.h" -#include "DmaManager.h" -#include "error.h" -#include "TaskManager.h" -#include "SymTable.h" - -SymTable *TaskManager::symtb; - -SpeTask::SpeTask(TaskListPtr _list, TaskPtr _task, void *rbuf, void *wbuf, - DmaManager* cn) -{ - list = _list; - task = _task; - readbuf = rbuf; - writebuf = wbuf; - connector = cn; -} - -void -SpeTask::read(void) -{ - __debug("[SpeTask:%s]\n", __FUNCTION__); - - //task = &list->tasks[--list->length]; - connector->dma_load(readbuf, task->in_addr, task->in_size, DMA_READ); -} - -void -SpeTask::exec(void) -{ - __debug("[SpeTask:%s]\n", __FUNCTION__); - - connector->dma_wait(DMA_READ); - - __debug(" task->command = %d\n", task->command); - __debug(" task->in_size = %d\n", task->in_size); - __debug(" task->in_addr = 0x%x\n", task->in_addr); - __debug(" task->out_addr = 0x%x\n", task->out_addr); - __debug(" list->next = 0x%x\n", (unsigned int)list->next); - __debug(" list->length = 0x%x\n", (unsigned int)list->length); - - // obsolute - // task->in_size = func_list[task->command](writebuf, readbuf); - - // ¤´¤Á¤ã¤´¤Á¤ã¤·¤Æ¤ë¤Ê - // ºÇ½é¤«¤é void* ¤¸¤ã¤Ê¤¯¤Æ ´Ø¿ô¥Ý¥¤¥ó¥¿ ¤È¤·¤Æ¤¤¤ì¤ë¤Ù¤­¤«¡© - int (*func)(void*, void*) - = (int (*)(void*,void*))TaskManager::get_address(task->command); - task->in_size = func(writebuf, readbuf); - connector->dma_store(writebuf, task->out_addr, task->in_size, DMA_WRITE); -} - -void -SpeTask::write(void) -{ - __debug("[SpeTask:%s]\n", __FUNCTION__); - - connector->dma_wait(DMA_WRITE); - connector->mail_write((unsigned int)task->self); -} - -SpeTaskBase* -SpeTask::next(SpeManager *m, SpeTaskBase *p) -{ - __debug("[SpeTask:%s]\n", __FUNCTION__); - - delete p; - - // ¤³¤³Ä¾¤µ¤Í¤Ð¡£¤É¤¦¤ä¤Ã¤Æ if ʸ¾Ã¤½¤¦¡© - // ¥ª¥Ö¥¸¥§¥¯¥ÈÁý¤ä¤»¤Ð¤¤¤¤¤Î¤«¤Ê - if (list->length == 0) { - if (list->next == 0) { - return new SpeNop2Ready(connector); - } else { - return new SpeTaskList((unsigned int)list->next, - m->get_curListBuf(), connector); - } - } else { - //return new SpeTask(list, m->get_curReadBuf(), - //m->get_curWriteBuf(), connector); - - // ËÜÅö¤Ï¡¢¤³¤³¤Ç task->command ¤ËÂбþ¤¹¤ë¡¢ - // SpeTask ¤ò·Ñ¾µ¤¹¤ë class ¤òºî¤ì¤Ð¤¤¤¤¡£¡£¡£¤Ï¤º - return new SpeTask(list, &list->tasks[--list->length], - m->get_curReadBuf(), m->get_curWriteBuf(), - connector); - } -} - -#if 0 -SpeTask -createSpeTask(TaskListPtr list, void *rbuf, void *wbuf, DmaManager *cn) -{ - TaskPtr task; - - task = &list->tasks[--list->length]; - -} -#endif diff -r c964110017c8 -r e198c3e01cec TaskManager/kernel/spe/SpeTaskList.cc --- a/TaskManager/kernel/spe/SpeTaskList.cc Fri Feb 15 19:44:23 2008 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -#include -#include "SpeTaskList.h" -#include "SpeTask.h" -#include "SpeNop2Ready.h" -#include "DmaManager.h" -#include "error.h" - -SpeTaskList::SpeTaskList(unsigned int addr, TaskListPtr listbuf, DmaManager* c) -{ - params_addr = addr; - list = listbuf; - connector = c; -} - -void -SpeTaskList::read(void) -{ - __debug("[SpeTaskList:%s]\n", __FUNCTION__); - - connector->dma_load(list, params_addr, sizeof(TaskList), DMA_READ); - connector->dma_wait(DMA_READ); -} - -SpeTaskBase* -SpeTaskList::next(SpeManager *m, SpeTaskBase *p) -{ - __debug("[SpeTaskList:%s]\n", __FUNCTION__); - - delete p; - - if (list->length < 1) { - return new SpeNop2Ready(connector); - } else { - // ËÜÅö¤Ï¡¢¤³¤³¤Ç task->command ¤ËÂбþ¤¹¤ë¡¢ - // SpeTask ¤ò·Ñ¾µ¤¹¤ë class ¤òºî¤ì¤Ð¤¤¤¤¡£¡£¡£¤Ï¤º - return new SpeTask(list, &list->tasks[--list->length], - m->get_curReadBuf(), - m->get_curWriteBuf(), - connector); - } -} diff -r c964110017c8 -r e198c3e01cec TaskManager/kernel/spe/main.cc --- a/TaskManager/kernel/spe/main.cc Fri Feb 15 19:44:23 2008 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ -#include -#include -#include "SpeManager.h" - -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 (*func_list[16])(void* wbuf, void* rbuf) = {add, sub, mul, div, sum, sum2, 0}; - -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); -} - -#ifdef CELL - -#include "dma_spe.h" - -int -main(unsigned long long speid, - unsigned long long argc, unsigned long long argv) -{ - SpeManager *manager = new SpeManager(); - DmaManager *connect = new SpeDmaManager(); - manager->set_connect(connect); - - printf("[SPE] start\n"); - - manager->init(); - manager->run(); - manager->finish(); - - return 0; -} -#else - -#endif /* CELL */