Mercurial > hg > Members > kono > Cerium
diff TaskManager/Cell/spe/CellDmaManager.cc @ 672:3b6290c05f9f
add profiling code
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 05 Dec 2009 20:20:08 +0900 |
parents | 7c9ded1ea750 |
children | 45ddb28c592d |
line wrap: on
line diff
--- a/TaskManager/Cell/spe/CellDmaManager.cc Sat Dec 05 17:26:58 2009 +0900 +++ b/TaskManager/Cell/spe/CellDmaManager.cc Sat Dec 05 20:20:08 2009 +0900 @@ -2,6 +2,8 @@ #include <stdlib.h> #include "CellDmaManager.h" + + /** * DMA Load * @@ -10,8 +12,7 @@ * @param[in] size Size of Load Data * @param[in] mask DMA tag */ -void -CellDmaManager::dma_load(void *buf, memaddr addr, uint32 size, uint32 mask) +void CellDmaManager::dma_load(void *buf, memaddr addr, uint32 size, uint32 mask) { if (size == 0) return ; mfc_get((volatile void *)buf, addr, size, mask, 0, 0); @@ -25,20 +26,82 @@ * @param[in] size Size of Store Data * @param[in] mask DMA tag */ -void -CellDmaManager::dma_store(void *buf, memaddr addr, uint32 size, uint32 mask) +void CellDmaManager::dma_store(void *buf, memaddr addr, uint32 size, uint32 mask) { if (size == 0) return ; mfc_put((volatile void *)buf, addr, size, mask, 0, 0); } +void CellDmaManager::dma_wait(uint32 mask) +{ + (this->*start_dmawait_profile)(); + mfc_write_tag_mask(1 << mask); + mfc_write_tag_update_all(); + mfc_read_tag_status(); + (this->*end_dmawait_profile)(); +} + +void CellDmaManager::mail_write(memaddr data) +{ + (this->*start_dmawait_profile)(); + spu_write_out_mbox((uint32)data); + if (ABIBIT>32) { + unsigned long data0 = (unsigned long)data; + spu_write_out_mbox((uint32)(data0>>4)); + } + (this->*end_dmawait_profile)(); +} + +memaddr CellDmaManager::mail_read() +{ + (this->*start_dmawait_profile)(); + memaddr data = (memaddr)spu_read_in_mbox(); + if (ABIBIT>32) { + data += (spu_read_in_mbox()<<4); + } + (this->*end_dmawait_profile)(); + return data; +} + +void CellDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask) +{ + mfc_getl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, + mask, 0, 0); +} + +void CellDmaManager::dma_storeList(ListDataPtr list, void *buff, uint32 mask) +{ + mfc_putl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, + mask, 0, 0); +} + + +CellDmaManager::CellDmaManager() +{ + stop_profile(); +} + +void +CellDmaManager::start_profile() +{ + start_dmawait_profile = &CellDmaManager::do_start_dmawait_profile; + end_dmawait_profile = &CellDmaManager::do_end_dmawait_profile; +} + +void +CellDmaManager::stop_profile() +{ + start_dmawait_profile = &CellDmaManager::null_start_dmawait_profile; + end_dmawait_profile = &CellDmaManager::null_end_dmawait_profile; +} + /** * DMA Wait * * @param[in] mask Tag for Wait DMA process */ void -CellDmaManager::start_dmawait_profile() +CellDmaManager::do_start_dmawait_profile() { wait_time = spu_readch(SPU_RdDec); global_busy_time += busy_time - wait_time; @@ -46,13 +109,16 @@ } void -CellDmaManager::end_dmawait_profile() +CellDmaManager::do_end_dmawait_profile() { wait_time = spu_readch(SPU_RdDec); global_wait_time += 0xffffffff - wait_time; busy_time = wait_time; } +void CellDmaManager::null_start_dmawait_profile() {} +void CellDmaManager::null_end_dmawait_profile() {} + void CellDmaManager::show_dma_wait(int cpu) { @@ -63,52 +129,5 @@ ((double)global_busy_time)/((double)(global_busy_time+global_wait_time))*100.0); } -void -CellDmaManager::dma_wait(uint32 mask) -{ -#ifdef SPU_PROFILE - start_dmawait_profile(); -#endif - mfc_write_tag_mask(1 << mask); - mfc_write_tag_update_all(); - mfc_read_tag_status(); -#ifdef SPU_PROFILE - end_dmawait_profile(); -#endif -} - -void -CellDmaManager::mail_write(memaddr data) -{ - spu_write_out_mbox((uint32)data); - if (ABIBIT>32) { - unsigned long data0 = (unsigned long)data; - spu_write_out_mbox((uint32)(data0>>4)); - } -} - -memaddr -CellDmaManager::mail_read() -{ - memaddr data = (memaddr)spu_read_in_mbox(); - if (ABIBIT>32) { - data += (spu_read_in_mbox()<<4); - } - return data; -} - -void -CellDmaManager::dma_loadList(ListDataPtr list, void *buff, uint32 mask) -{ - mfc_getl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, - mask, 0, 0); -} - -void -CellDmaManager::dma_storeList(ListDataPtr list, void *buff, uint32 mask) -{ - mfc_putl(buff, 0, list->element, sizeof(mfc_list_element_t)*list->length, - mask, 0, 0); -} /* end */