はじめに
Xilinx AI Engine の シミュレータ (aiesimulator) を動かしてみた(その3)です。
aiesimulator のログの続き
Initializing AIE driver... Initializing ADF API...
この部分は、Work/ps/c_rts/aie_control.cpp の InitializeAIEControl クラスのコンストラクタ内で出力されています。
InitializeAIEControl() { printf("Initializing AIE driver...\n"); XAie_SetupConfig(ConfigPtr, HW_GEN, XAIE_BASE_ADDR, XAIE_COL_SHIFT, XAIE_ROW_SHIFT, XAIE_NUM_COLS, XAIE_NUM_ROWS, XAIE_SHIM_ROW, XAIE_MEM_TILE_ROW_START, XAIE_MEM_TILE_NUM_ROWS, XAIE_AIE_TILE_ROW_START, XAIE_AIE_TILE_NUM_ROWS); XAie_CfgInitialize(&(DevInst), &ConfigPtr); #if defined(__AIESIM__) #if defined(__CDO__) XAie_SetIOBackend(&(DevInst), XAIE_IO_BACKEND_CDO); // Set aiengine driver library to run for CDO Mode XAie_UpdateNpiAddr(&(DevInst), 0xf70a0000); #else //AIE driver currently error out XAie_UpdateNpiAddr for AIESIM #endif #else XAie_UpdateNpiAddr(&(DevInst), 0xf70a0000); #endif #if defined(__AIESIM__) && !defined(__CDO__) XAie_TurnEccOff(&DevInst); #endif printf("Initializing ADF API...\n"); #if defined(__AIESIM__) && !defined(__CDO__) extern unsigned ess_debug; #else unsigned ess_debug = false; #endif #ifdef __EXCLUDE_PL_CONTROL__ bool exclude_pl_control = true; #else bool exclude_pl_control = false; #endif #ifdef __CDO__ int trace_config_stream_option = 2; #else int trace_config_stream_option = 0; #endif adf::initializeConfigurations(&DevInst, XAIE_NUM_COLS, XAIE_AIE_TILE_NUM_ROWS, XAIE_MEM_TILE_NUM_ROWS, GraphConfigurations, NUM_GRAPH, nullptr, 0, nullptr, 0, nullptr, 0, nullptr, 0, nullptr, 0, nullptr, 0, PLIOConfigurations, NUM_PLIO, nullptr, 0, trace_config_stream_option, nullptr, ess_debug, exclude_pl_control, true, &broadcastConfigForCoreEnable, true, 2); } } initAIEControl;
この initAIEControl インスタンスは、どこかで呼ばれています。libadf.a の中にあるので、この libadf.a をリンクするだからが呼んでいるようです。
XAIEFAL: INFO: Resource group Avail is created. XAIEFAL: INFO: Resource group Static is created. XAIEFAL: INFO: Resource group Generic is created. IP-INFO: [ps_i4_ps_main] IP loaded.
ps_i4_ps_main は、config/scsim_config.json の中に、次のように設定されています。
{ "name": "ps_i4_ps_main", "ip": "ps", "lib_path": "ps/c_rts/systemC/generated-objects/ps_i4.so", "pl_freq": 250000000.0, "axi_mm": [ { "port_name": "ps_axi", "direction": "ps_to_gm", "noc_endpoint": "NOC_NMU128_X0Y5", "bus_width": 0 } ], "event_bus": [] }
ps_i4_ps_main は、ps という ip で、ps/c_rts/systemC/generated-objects/ps_i4.so がライブラリになります。/Work/ps/c_rts/systemC/generated-source/genwrapper_for_ps_i4.cpp をコンパイルしたものですね。動作周波数 (pl_freq) は AI Engine の動作周波数 1GHz の 1/4 の 250MHzです。
"noc_endpoint": "NOC_NMU128_X0Y5" は、Work/noc/noc_soln.ncr の中で下記のように定義されています。PS_AIE_Config_Master に対応します。 つまり、ps (ps_i4_ps_main) は、PS_AIE_Config_Master ということになります。
{ "Name": "NOC_NMU128_X0Y5", "TrafficLInst": "PS_AIE_Config_Master", "DestId": 128 },
Warning: AieSimConfig: xv_cpt_lib_path env is not set In file: aie_config.cpp:451 Warning: AieSimConfig: xv_cxl_ip_path env is not set In file: aie_config.cpp:472 Info: DEVICE FILE: /mnt/usb/XILINX/Vivado/2022.1/Vitis/2022.1/aietools/data/devices/VC1902.json Info: AIE SOLUTION FILE: Work/arch/aieshim_solution.aiesol
Work/arch/aieshim_solution.aiesol は、下記のようになっています。
cat Work/arch/aieshim_solution.aiesol { "Placement": [ { "LogicalInstance" : { "InstanceName" : "ai_engine_0", "PortName" : "S00_AXIS"}, { "Placement": [ { "LogicalInstance" : { "InstanceName" : "ai_engine_0", "PortName" : "S00_AXIS"}, "PhysicalInstance" : [{ "name" : "AIE_PL_X23Y0_AIE_PL_S_AXIS_1", "column" : 24, "channel" : 1 }], "IsSoft" : true }, { "LogicalInstance" : { "InstanceName" : "ai_engine_0", "PortName" : "S01_AXIS"}, "PhysicalInstance" : [{ "name" : "AIE_PL_X23Y0_AIE_PL_S_AXIS_2", "column" : 24, "channel" : 2 }], "IsSoft" : true }, { "LogicalInstance" : { "InstanceName" : "ai_engine_0", "PortName" : "M00_AXIS"}, "PhysicalInstance" : [{ "name" : "AIE_PL_X23Y0_AIE_PL_M_AXIS_1", "column" : 24, "channel" : 1 }], "IsSoft" : true } ] }
ai_engine_0 というインスタンスは、
- S00_AXIS
- S01_AXIS
- M00_AXIS
ポートを持っていて、それぞれ、column 24 に繋がっています。
- "PhysicalInstance" : [{ "name" : "AIE_PL_X23Y0_AIE_PL_S_AXIS_1", "column" : 24, "channel" : 1 }],
- "PhysicalInstance" : [{ "name" : "AIE_PL_X23Y0_AIE_PL_S_AXIS_2", "column" : 24, "channel" : 2 }],
- "PhysicalInstance" : [{ "name" : "AIE_PL_X23Y0_AIE_PL_M_AXIS_1", "column" : 24, "channel" : 1 }],
[AIESIM_OPTIONS]: aiesim_options file path data/aiesim_options.txt
data/aiesim_options.txt は、次のようになっています。aiesimulator コマンドの --pkg-dir オプションで指定したディレクトリになります。
cat data/aiesim_options.txt AIE_PKG_DIR=/mnt/c/Users/haray/home/src/aie_hw/Work
Disable unused tiles xpe directory: Work Found xpe file Work/reports/graph.xpe
Work/reports/graph.xpe は、次のようになっています。
cat Work/reports/graph.xpe <?xml version="1.0"?> <POWERDATA data="AI-Engine Compiler" dataVersion="2022.1" design="graph" date="Sat Sep 24 10:49:54 2022 "> <DEVICE part="xcvc1902" grade="extended" package="vsva2197" speed="-1LP" process="typical" vid="No"></DEVICE> <AIE status="COMPILER_OUTPUT"> <AIE_MODULE name="graph" num_tiles="1" clk_freq="1000"> <TILE name="CR(24,0)" type="int16" int_core_load="0.6" fp_core_load="0" mem_banks="2" mem_rw_rate="0.2" stream_util="0.12" coordinates="24,1"> <KERNEL name="i0" int_core_load="1" fp_core_load="0"></KERNEL> </TILE> <SHIM name="SHIM(19, 0)" type="AIE_PL_NOC_SHIM" stream_util="0" num_pl_streams="0" num_aximm_connections="1" coordinates="19,0"></SHIM> <SHIM name="SHIM(24, 0)" type="AIE_PL_SHIM" stream_util="0.13" num_pl_streams="3" num_aximm_connections="0" coordinates="24,0"></SHIM> </AIE_MODULE> </AIE> </POWERDATA>
ISS disables unused tiles Optimized ISS Wrapper (R+W), r2p21 Running Dispatch Server on port: 36851 Current Directory=/mnt/c/Users/haray/home/src/aie_hw -------------------------------------------------------------------------------------------------- SLAVE STREAM INFO: | Port Name | Port Width | Stream Type | Channel Index | S00_AXIS | 32 | PL STREAM | 193 | S01_AXIS | 32 | PL STREAM | 194 -------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------- MASTER STREAM INFO: | Port Name | Port Width | Stream Type | Channel Index | M00_AXIS | 32 | PL STREAM | 145 --------------------------------------------------------------------------------------------------
上記のログに出てきた、
- S00_AXIS
- S01_AXIS
- M00_AXIS
は、Work/arch/aieshim_solution.aiesol に出てきたものと同じですね。
おわりに
今回は、config/scsim_config.json の続きから aiesimulator でシミュレーションが始まる前までについて、見てみました。