您的位置:

Xilinx Vitis全方位解析

一、Xilinx Vitis简介

Xilinx Vitis是一款全新的开发工具套件,它能够自由切换多种编程语言,如C++、OpenCL、Python等,以及支持多种硬件平台,包括Xilinx的FPGA和ACAP (Adaptive Compute Acceleration Platform)。这使得它具备了极高的灵活性,可以灵活的应对不同类型的开发需求,无论是数据中心、云端还是边缘智能应用,都能够得到有效的支持。

Xilinx Vitis集成多种开发工具,包括Vivado、SDSoC和SDAccel,能够覆盖从系统级开发到高层次应用程序开发的全流程,帮助用户快速构建高效的应用。

二、Xilinx Vitis的核心技术

Xilinx Vitis打破了传统的FPGA开发中,硬件描述语言(VHDL/Verilog)与软件开发语言(C/C++)之间的技术壁垒,引入了一种新的编程模型,称之为Xilinx Runtime (XRT),基于OpenCL编写,将FPGA看作协处理器,使得开发者能够直接使用CPU的软件编写方式进行并行程序设计,而无需编写硬件描述语言。在Xilinx Vitis中,用户可以在软件框架内编写并行程序,同时配合硬件部分使用OpenCL CKernel,由Vitis工具自动将其综合到FPGA中运行。这样可以大大降低FPGA应用开发的门槛,提高开发效率。

同时,Xilinx Vitis还采用了一种新的优化技术——SDAccel优化技术,可以为HLS设计提供高效的算法优化,提高了硬件加速器的效率。Xilinx SDNet技术的嵌入,可以加快数据流进程,并提高FPGA硬件解决方案的开发效率。

Xilinx Vitis中还引入了一种新的交互式开发体验,在开发过程中,可以直接在Vitis开发环境中创建和调试应用程序.

三、Xilinx Vitis的软件开发模型

Xilinx Vitis采用了一种新的软件开发模型——层次化软件开发模型 (Hierarchical Software Development Model),与目前的高层次综合(HLS)技术相结合,实现了从整体系统层面进行设计、优化、实现和调试。Xilinx Vitis中的一级模型设计是硬件抽象层面,包括RTL设计和HLS设计;二级模型是C++设计,整合开发了从软件设计到硬件实现的一体化性能计算环境,在应用程序中可以发现HLS语言设计,从而获得性能的提升。

同时,Xilinx Vitis还支持第三方动态代码库(Dynamic Link Libraries)和静态代码库(Static Libraries)的使用,能够实现各种不同的硬件环境下的应用程序需求,提高片上系统的可扩展性。

四、示例代码

#include 
#include 
   

int main() {
  // 初始化OpenCL环境
  cl_platform_id platform;
  cl_device_id device;
  cl_context context;
  cl_command_queue commands;
  cl_program program;
  cl_kernel kernel;

  clGetPlatformIDs(1, &platform, NULL);
  clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, 1, &device, NULL);
  context = clCreateContext(0, 1, &device, NULL, NULL, NULL);
  commands = clCreateCommandQueue(context, device, 0, NULL);

  // 创建和构建OpenCL内核
  const char* kernel_source =
  "#include 
    \n"
  "__kernel void add(__global int* a, __global int* b, __global int* c) {\n"
  "  int gid = get_global_id(0);\n"
  "  c[gid] = a[gid] + b[gid];\n}"
  ;
  program = clCreateProgramWithSource(context, 1, &kernel_source, NULL, NULL);
  clBuildProgram(program, 0, NULL, NULL, NULL, NULL);
  kernel = clCreateKernel(program, "add", NULL);

  // 定义变量
  int a[100], b[100], c[100];

  // 初始化变量
  for (int i = 0; i < 100; i++) {
      a[i] = i;
      b[i] = i * 2;
  }

  // 设置OpenCL内核参数
  cl_mem a_buffer, b_buffer, c_buffer;
  a_buffer = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int) * 100, a, NULL);
  b_buffer = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int) * 100, b, NULL);
  c_buffer = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(int) * 100, NULL, NULL);
  clSetKernelArg(kernel, 0, sizeof(cl_mem), &a_buffer);
  clSetKernelArg(kernel, 1, sizeof(cl_mem), &b_buffer);
  clSetKernelArg(kernel, 2, sizeof(cl_mem), &c_buffer);

  // 执行OpenCL内核
  size_t global_size = 100;
  clEnqueueNDRangeKernel(commands, kernel, 1, NULL, &global_size, NULL, 0, NULL, NULL);

  // 读取计算结果
  clEnqueueReadBuffer(commands, c_buffer, CL_TRUE, 0, sizeof(int) * 100, c, 0, NULL, NULL);
  for (int i = 0; i < 100; i++) {
      std::cout << c[i] << std::endl;
  }

  // 释放OpenCL资源
  clReleaseMemObject(a_buffer);
  clReleaseMemObject(b_buffer);
  clReleaseMemObject(c_buffer);
  clReleaseKernel(kernel);
  clReleaseProgram(program);
  clReleaseCommandQueue(commands);
  clReleaseContext(context);

  return 0;
}

    
   
  

五、总结

Xilinx Vitis是一款强大的开发工具套件,在FPGA应用开发中起到了至关重要的作用,它破除了传统的FPGA开发模式,通过引入新的编程模型和技术,提高了开发效率和FPGA的性能表现。

本文从多个方面对Xilinx Vitis进行了详细的阐述,从介绍其基础知识到核心技术、软件开发模型以及具体实现。相信本文对那些初次接触Xilinx Vitis的开发者,能够起到较好的参考作用。