在裸机/独立环境中,AMD 提供了独立的板级支持包 (BSP)、驱动程序和库,以供应用程序用于减少开发工作量。如 Linux 上的主机编程 中所述,裸机系统的顶层应用还必须集成和管理 AI 引擎计算图与 PL 内核。
图 1. AI 引擎裸机软件栈
以下提供了裸机系统的顶层应用 (main.cpp) 示例:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include "platform.h"
#include "xparameters.h"
#include "xil_io.h"
#include "xil_cache.h"
#include "graph.cpp"
......
#define MM2S_BASE XPAR_MM2S_S_AXI_CONTROL_BASEADDR
#define S2MM_BASE XPAR_S2MM_S_AXI_CONTROL_BASEADDR
#define MEM_OFFSET 0x10
#define SIZE_OFFSET 0x1C
#define CTRL_OFFSET 0x0
int RunTest(uint64_t mm2s_base, uint64_t s2mm_base, int32_t* in, int32_t* golden,
int32_t* out, int input_size, int output_size)
{
int i;
int errCount = 0;
uint64_t memAddr = (uint64_t)in;
uint64_t mem_outAddr = (uint64_t)out;
printf("Starting test w/ cu\n");
printf("Starting mm2s & s2mm\n");
Xil_Out32(mm2s_base + MEM_OFFSET, (uint32_t) memAddr);
Xil_Out32(mm2s_base + MEM_OFFSET + 4, 0);
Xil_Out32(s2mm_base + MEM_OFFSET, (uint32_t) mem_outAddr);
Xil_Out32(s2mm_base + MEM_OFFSET + 4, 0);
Xil_Out32(mm2s_base + SIZE_OFFSET, input_size);
Xil_Out32(s2mm_base + SIZE_OFFSET, output_size);
Xil_Out32(mm2s_base + CTRL_OFFSET, 1);
Xil_Out32(s2mm_base + CTRL_OFFSET, 1);
printf("GRAPH INIT\n");
clipgraph.init();
printf("GRAPH RUN\n");
clipgraph.run();
//Wait for s2mm to be done
while(1) {
uint32_t v = Xil_In32(s2mm_base + CTRL_OFFSET);
if(v & 6) {
break;
}
}
printf("PLIO IP DONE!\n");
for(i = 0; i < output_size; i++) {
if((((int32_t*)out)[i] != ((int32_t*)golden)[i]) ) {
printf("Error found in sample %d != to the golden %d\n", i+1, ((int32_t*)out)[i], ((int32_t*)golden)[i]);
errCount++;
}
else
printf("%d\n ",((int32_t*)out)[i]);
}
printf("Ending test w/ cu\n");
return errCount;
}
int main()
{
int i;
int32_t* out;
int errCount;
Xil_DCacheDisable();
init_platform();
sleep(1);
printf("Beginning test\n");
//Preparing data
......
//Run PL kernels & AIE & Verification
errCount = RunTest(MM2S_BASE, S2MM_BASE, (int32_t*)cint16input, int32golden, out, INPUT_SIZE, OUTPUT_SIZE);
//Post-Processing
if(errCount == 0)
printf("Test passed. \n");
else
printf("Test failed! Error count: %d \n",errCount);
cleanup_platform();
return errCount;
}
此代码示例中的步骤如下所示:
-
main()
函数用于初始化平台、数据、运行测试、验证返回代码和返回错误代码。 -
#include "graph.cpp"
包含用于例化计算图对象clipgraph
的代码。graph.cpp
的用法与aiecompiler
和仿真中的用法相同,但可通过__AIESIM__
宏和__X86SIM__
宏来加以保护。如需了解有关这些宏的用法的信息,请参阅 宏。 -
Xil_DCacheDisable()
会禁用数据高速缓存。这是确保 API 间数据同步所必需的。 -
RunTest()
用于将内核必要的数据传递至进程并返回结果。 -
Xil_Out32
会写入寄存器以控制 PL 内核。如需了解更多详情,请参阅下一节。 -
clipgraph.init()
用于初始化计算图。 -
clipgraph.run()
用于启动计算图。
前述代码示例引用从裸机 BSP 自动生成的 xparameters.h。应用需确保正确生成裸机 BSP,以便为所有驱动程序正确分配存储器映射地址。
xil_io.h 包含通用的驱动程序 I/O API。这是访问驱动程序的首选方法。