簡介: 系統結構實驗常用的工具是仿真器simulator。Multi2sim是多核時鐘精確仿真器,支持可變的存儲層次結構,網絡鏈接目前只支持Bus和P2P,但是對于內存的仿真只是簡單返回200cycle延遲,對于研究內存控制器有很大的限制。DRAMsim是內存時鐘精確仿真器。于
簡介:
系統結構實驗常用的工具是仿真器simulator。Multi2sim是多核時鐘精確仿真器,支持可變的存儲層次結構,網絡鏈接目前只支持Bus和P2P,但是對于內存的仿真只是簡單返回200cycle延遲,對于研究內存控制器有很大的限制。DRAMsim是內存時鐘精確仿真器。于是本文的工作是把Multi2sim與DRAMsim相連接實現更強大的功能。
源碼:
1、Multi2sim: A CPU-GPU Model for Heterogeneous Computing
CSDN下載地址:http://download.csdn.net/detail/koala002/3857207
2、DRAMsim: DRAMSim2 is a cycle accurate model of a DRAM memory controller
CSDN下載地址:http://download.csdn.net/detail/koala002/3857463
步驟:
1、解決C++與C程序鏈接問題
Multi2sim與DRAMsim接口文件:由于Automake工具族實現對*.c后綴文件使用CC變量編譯器,*.cpp后綴使用CXX變量編譯器,所以更改后綴名為.cpp
libcachesystem/cachesystem.cpp
首先在文件開頭包含頭文件,定義內存讀寫處理函數,全局定義一個內存實例指針
#ifdef MACRO_DRAM_SIM #include "../libdram/MemorySystem.h" class some_object { public: void read_complete(unsigned, uint64_t, uint64_t); void write_complete(unsigned, uint64_t, uint64_t); int add_one_and_run(); }; /* callback functors */ void some_object::read_complete(unsigned id, uint64_t address, uint64_t clock_cycle) { //esim_schedule_event(EV_MOESI_FIND_AND_LOCK_FINISH, stack, ccache->lat); //printf("[Callback] read complete: %d 0x%lx cycle=%lu\n", id, address, clock_cycle); } void some_object::write_complete(unsigned id, uint64_t address, uint64_t clock_cycle) { //esim_schedule_event(EV_MOESI_FIND_AND_LOCK_FINISH, stack, ccache->lat); //printf("[Callback] write complete: %d 0x%lx cycle=%lu\n", id, address, clock_cycle); } /* FIXME: this may be broken, currently */ void power_callback(double a, double b, double c, double d) { printf("power callback: %0.3f, %0.3f, %0.3f, %0.3f\n",a,b,c,d); } /* init one dramsim instance */ class MemorySystem* g_dramsim_memory; #endif
#ifdef MACRO_DRAM_SIM /* new one instance */ g_dramsim_memory= new MemorySystem(0, "ini/DDR2_micron_16M_8b_x8_sg3E.ini",\ "system.ini", "/home/jyq/multi2sim-3.1.1/src/libdram", "resultsfilename", 1024*500); /* create and register our callback functions */ Callback_t *read_cb = new Callback(new some_object, &some_object::read_complete); Callback_t *write_cb = new Callback (new some_object, &some_object::write_complete); g_dramsim_memory->RegisterCallbacks(read_cb, write_cb, power_callback); #endif
libcachesystem/moesi.cpp:一致性協議操作,讀寫操作
首先,頭文件包含,并且注意代碼快兩端加入extern "C",以保證和原來代碼兼容
#ifdef MACRO_DRAM_SIM #include "../libdram/MemorySystem.h" extern MemorySystem* g_dramsim_memory; #endif extern "C"{ #include "cachesystem.h"
如果發現沒有lonet,則為最后一級緩存,那么像內存插入transaction。
#ifdef MACRO_DRAM_SIM /* create a transaction and add it */ if(!ccache->lonet){ Transaction tr = Transaction(stack->read?DATA_READ:DATA_WRITE,stack->addr, stack); g_dramsim_memory->addTransaction(tr); } #endif
原來代碼內存仿真都只是簡單返回200Cycles,所以這里改動如果發現是非內存讀操作才直接加入延遲。否則等待內存操作返回后由讀寫完成注冊函數處理。
#ifdef MACRO_DRAM_SIM /* Access latency */ if(ccache->lonet ){ esim_schedule_event(EV_MOESI_FIND_AND_LOCK_FINISH, stack, ccache->lat); } #else esim_schedule_event(EV_MOESI_FIND_AND_LOCK_FINISH, stack, ccache->lat); #endif
void cpu_run():實現時鐘精確仿真,其中子函數cpu_stages()實現的是每周期取指、譯碼、執行、提交、寫回流水線,所以在之后加入內存更新操作,這里注意處理器與內存的頻率倍數。
#ifdef MACRO_DRAM_SIM
/* Dramsim stage*/ extern class MemorySystem* g_dramsim_memory; g_dramsim_memory->update(); #endif
2、為了代碼最小改動,將DRAMSim編譯成動態鏈接庫,然后在鏈接處與Multi2sim代碼相鏈接即可。
3、合并代碼過程中,由于C標準允許void*指針賦給其他類型指針,但C++標注不允許,所以在改用g++編譯某些源文件時需要在這些賦值位置強轉類型。
4、Makefile改寫可以參考automake、configure等資料。
5、本文只是基本大體改動框架,細節功能實現或者擴展功能還需要更細改寫。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com