リセットおよび再読み込みフローのホスト アプリケーション - 2023.2 日本語

AI エンジン ツールおよびフロー ユーザー ガイド (UG1076)

Document ID
UG1076
Release Date
2023-12-04
Version
2023.2 日本語

リセットおよび再読み込みフローでは、ホスト アプリケーションは前のステップで生成された AI エンジン専用 XCLBIN と PL 専用 XCLBIN を使用する必要があります。すべての XCLBIN ファイルには、UUID (Universal Unique Identifier) があります。UUID は、XRT load_xclbin API を使用して取得できます。ホスト アプリケーションは、PL 専用 XCLBIN ファイルと AI エンジン専用 XCLBIN ファイルに関連付けられている UUID を使用してこれらの XCLBIN を読み込む必要があります。

ホスト アプリケーション コードでは、次の一連の動作が実行されます。

  1. デバイスを開きます。
  2. PL 専用 XCLBIN を読み込み、PL UUID を取得します。
  3. AI エンジン専用 XCLBIN を読み込み、AI エンジン UUID を取得します。
  4. PL カーネルで実行する XRT API で PL UUID を使用します。
  5. AI エンジン グラフで実行する XRT API で AI エンジン UUID を使用します。
  6. PL カーネルおよび AI エンジン グラフで実行します。
次にホスト コードの例を示します。
int open_xclbin(char* pl_xclbinFilename,char* aie_xclbinFilename,xrt::device &device, xrt::uuid &pl_id, xrt::uuid &aie_id){
  int ret=0;
  // Open the device
  device = xrt::device(0); //device index=0
  //Load PL-only XCLBIN and get PL UUID.
  pl_id = device.load_xclbin(pl_xclbinFilename);
  //Load AI エンジン-only XCLBIN and get AI Engine UUID.
  aie_id = device.load_xclbin(aie_xclbinFilename);
  return ret;
}

int run_graph(const xrt::device &device,const xrt::uuid &pl_id,const xrt::uuid &aie_id,int iterations){
  int output_size_in_bytes=iterations*WINDOW_SIZE_in_Bytes;
  int OUTPUT_SIZE=output_size_in_bytes/4;

  //Use PL UUID with XRT API operating on PL kernels.
  auto s2mm = xrt::kernel(device, pl_id, "s2mm");
  auto mm2s = xrt::kernel(device, pl_id, "datagen");

  // output memory
  auto out_bo = xrt::bo(device, output_size_in_bytes, s2mm.group_id(0));
  auto host_out=out_bo.map<int*>();

  auto s2mm_run = s2mm(out_bo, nullptr, OUTPUT_SIZE);//1st run for s2mm has started
  auto mm2s_run = mm2s(nullptr, OUTPUT_SIZE);

  //Use AI Engine UUID with XRT API operating on AI Engine graphs.
  auto gr=xrt::graph(device,aie_id,"gr_pl");
  gr.run(iterations);

  int match=0;
  s2mm_run.wait();
  out_bo.sync(XCL_BO_SYNC_BO_FROM_DEVICE);
  for(int i=0;i<OUTPUT_SIZE;i++){
    if(host_out[i]!=i+1){
      match=1;
    }
  }
  return match;
}

int main(int argc, char* argv[]) {
  if(argc < 4) {
    std::cout << "Usage: " << argv[0] << " <pl_xclbin> <aie_xclbin> <iterations>" << std::endl;
    return EXIT_FAILURE;
  }
  char* pl_xclbinFilename=argv[1];
  char* aie_xclbinFilename=argv[2];
  int iterations=atoi(argv[3]);

  xrt::device device;
  xrt::uuid pl_id,aie_id;
  int ret;

  ret=open_xclbin(pl_xclbinFilename,aie_xclbinFilename,device,pl_id,aie_id);
  if(ret==0){
    std::cout<<"Download PL Xclbin successfully"<<std::endl;
    std::cout<<"Download AIE Xclbin successfully"<<std::endl;
  }

  ret=run_graph(device,pl_id,aie_id,iterations);
  std::cout << "TEST " << (ret ? " FAILED" : " PASSED") << std::endl;

  return (ret ? EXIT_FAILURE : EXIT_SUCCESS);
}