Mercurial > hg > Members > kono > Cerium
view TaskManager/Cell/spe/CellScheduler.cc @ 585:987380738a50
chain_old
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 26 Oct 2009 09:03:14 +0900 |
parents | 58240647b23b |
children | ab866bc8a624 |
line wrap: on
line source
#include <stdio.h> #include <malloc.h> #include "CellScheduler.h" #include "CellDmaManager.h" #include "error.h" // ユーザプログラムで定義 // なんだけど、それは微妙じゃね? extern void task_init(Scheduler *scheduler); void CellScheduler::init_impl() { connector = new CellDmaManager; mainMemNum = 0; task_init(this); // PPE側ではUser 側で既に呼んでいる... // SPE側はここで呼び出す必要がある // Fifo ではSPEは無いので呼び出されない } void* CellScheduler::allocate(int size) { return memalign(DEFAULT_ALIGNMENT, size); } /** * メインメモリ領域を allocate する。 * allocate した領域のアドレスは mainMem_get で取得するが、 * mainMem_get を実行できるのは * Renew Task (タスク内で create した Task) から。 * alloc してすぐ get しても、アドレス何も入ってないです。 */ void CellScheduler::mainMem_alloc(int id, int size) { mainMemList[id] = NULL; mainMemNum++; mail_write(MY_SPE_COMMAND_MALLOC); mail_write(id); mail_write(size); } void CellScheduler::mainMem_wait() { uint32 id; uint32 addr; while (mainMemNum > 0) { id = mail_read(); addr = mail_read(); mainMemList[id] = (void*)addr; mainMemNum--; } } /* dma channel を返す 本来、SPU用に閉じているはず。ユーザが明示的に使うことはない。 良くわからないが、ある分だけcounterで廻せば良い。しかし、 そのためには、全部で、get_tag()する必要があるはず。 */ #define TEX_LOAD1 0 // #define TEX_LOAD2 1 uint32 CellScheduler::get_tag() { static int count = 0; // int i = (count++ % 2); // return TEX_LOAD1*i + TEX_LOAD2*(1-i); // 0,1,2,3 return TEX_LOAD1+(count++ % 2); } /* end */