0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA之异构计算

FPGA设计论坛 来源:未知 2023-02-03 20:40 次阅读

对于一个开发人员,可能听说过FPGA,甚至在大学课程设计中,可能拿FPGA做过计算机体系架构相关的验证,但是对于它的第一印象可能觉得这是硬件工程师干的事儿。

目前,随着人工智能的兴起,GPU 借助深度学习,走上了历史的舞台,并且正如火如荼的跑者各种各样的业务,从 training 到 inference 都有它的身影。FPGA 也借着这股浪潮,慢慢地走向数据中心,发挥着它的优势。所以接下来就讲讲 FPGA 如何能让程序员们更好友好的开发,而不需要写那些烦人的 RTL 代码,不需要使用 VCS,Modelsim 这样的仿真软件,就能轻轻松松实现 unit test。

实现这一编程思想的转变,是因为 FPGA 借助 OpenCL 实现了编程,程序员只需要通过 C/C++ 添加适当的 pragma 就能实现 FPGA 编程。为了让您用 OpenCL 实现的 FPGA 应用能够有更高的性能,您需要熟悉如下介绍的硬件。另外,将会介绍编译优化选项,有助于将您的 OpenCL 应用更好的实现 RTL 的转换和映射,并部署到 FPGA 上执行。

FPGA 概览

FPGA 是高规格集成电路,可以实现通过不断的配置和拼接,达到无限精度的函数功能,因为它不像 CPU 或者 GPU 那样,基本数据类型的位宽都是固定的,相反 FPGA 能够做的非常灵活。在使用 FPGA 的过程中,特别适合一些 low-level 的操作,比如像 bit masking、shifting、addition 这样的操作都可以非常容易的实现。

为了达到并行化计算,FPGA 内部包含了查找表(LUTs),寄存器(register),片上存储(on-chip memory)以及算术运算硬核(比如数字信号处理器 (DSP) 块)。这些 FPGA 内部的模块通过网络连接在一起,通过编程的手段,可以对连接进行配置,从而实现特定的逻辑功能。这种网络连接可重配的特性为 FPGA 提供了高层次可编程的能力。(FPGA的可编程性就体现在改变各个模块和逻辑资源之间的连接方式)

举个例子,查找表(LUTs)体现的 FPGA 可编程能力,对于程序猿来说,可以等价理解为一个存储器(RAM)。对于 3-bits 输入的 LUT 可以等价理解为一个拥有 3位地址线并且 8 个 1-bit 存储单元的存储器(一个8长度的数组,数组内每个元素是 1bit)。那么当需要实现 3-bits 数字按位与操作的时候,8长度数组存的是 3-bits 输入数字的按位与结果,一共是 8 种可能性。当需要实现 3-bits 按位异或的时候,8长度数组存的是 3-bits 输入数字的按位异或结果,一共也是 8 种可能性。这样,在一个时钟周期内,3-bits 的按位运算就能够获取到,并且实现不同功能的按位运算,完全是可编程的(等价于修改 RAM 内的数值)。

3-bits 输入 LUT 实现按位与(bit-wise AND):

注:3-bits 输入 LUT 查找表

我们看到的三输入的按位与操作,如下所示,在 FPGA 内部,可通过 LUT 实现。

如上展示了 3输入,1输出的 LUT 实现。当将 LUT 并联,串联等方式结合起来后就可以实现更加复杂的逻辑运算了。

传统 FPGA 开发

▍传统 FPGA 与软件开发对比

对于传统的 FPGA 开发与软件开发,工具链可以通过下表简单对比:


注:传统 FPGA 与软件开发对比表

重点介绍一下,编译阶段的 Synthesis (综合),这部分与软件开发的编译有较大的不同。一般的处理器 CPU、GPU等,都是已经生产出来的 ASIC,有各自的指令集可以使用。但是对于 FPGA,一切都是空白,有的只是零部件,什么都没有,但是可以自己创造任何结构形式的电路,自由度非常的高。这种自由度是 FPGA 的优势,也是开发过程中的劣势。


传统的FPGA开发就像10岁时候的 Linux,想吃一个蛋糕,需要自己从原材料开始加工。FPGA 正是这种状态,想要实现一个算法,需要写 RTL,需要设计状态机,需要仿真正确性。

▍传统 FPGA 开发方式

复杂系统,需要使用有限状态机(FSM),一般就需要设计下图包含的三部分逻辑:组合电路,时序电路,输出逻辑。通过组合逻辑获取下一个状态是什么,时序逻辑用于存储当前状态,输出逻辑混合组合、时序电路,得到最终输出结果。

然后,针对具体算法,设计逻辑在状态机中的流转过程:

实现的 RTL 是这样的:

  1. module fsm_using_single_always (

  2. clock , // clockreset , // Active high, syn resetreq_0 , // Request 0req_1 , // Request 1gnt_0 , // Grant 0gnt_1

  3. );//=============Input Ports=============================input clock,reset,req_0,req_1; //=============Output Ports===========================output gnt_0,gnt_1;//=============Input ports Data Type===================wire clock,reset,req_0,req_1;//=============Output Ports Data Type==================reg gnt_0,gnt_1;//=============Internal Constants======================parameter SIZE = 3 ;

  4. parameter IDLE = 3'b001,GNT0 = 3'b010,GNT1 = 3'b100 ;//=============Internal Variables======================reg [SIZE-1:0] state ;// Seq part of the FSMreg [SIZE-1:0] next_state ;// combo part of FSM//==========Code startes Here==========================always @ (posedge clock)begin : FSMif (reset == 1'b1) begin

  5. state <= #1 IDLE;

  6. gnt_0 <= 0;

  7. gnt_1 <= 0;end else

  8. case(state)

  9. IDLE : if (req_0 == 1'b1) begin

  10. state <= #1 GNT0;

  11. gnt_0 <= 1; end else if (req_1 == 1'b1) begin

  12. gnt_1 <= 1;

  13. state <= #1 GNT1; end else begin

  14. state <= #1 IDLE; end

  15. GNT0 : if (req_0 == 1'b1) begin

  16. state <= #1 GNT0; end else begin

  17. gnt_0 <= 0;

  18. state <= #1 IDLE; end

  19. GNT1 : if (req_1 == 1'b1) begin

  20. state <= #1 GNT1; end else begin

  21. gnt_1 <= 0;

  22. state <= #1 IDLE; end

  23. default : state <= #1 IDLE;

  24. endcaseendendmodule // End of Module arbiter

传统的 RTL 设计,对于程序员简直就是噩梦啊,梦啊,啊~~~工具链完全不同,开发思路完全不同,还要分析时序,一个 Clock 节拍不对,就要推翻重来,重新验证,一切都显得太底层,不是很方便。那么,这些就交给专业的 FPGAer 吧,下面介绍的 OpenCL 开发 FPGA,有点像 25 岁的 Linux 了。有了高层次的抽象。用起来自然也会更加方便。

基于 OpenCL 的 FPGA 开发

OpenCL 对于 FPGA 开发,注入了新鲜的血液,一种面向异构系统的编程语言,将 FPGA 最为异构实现的一种可选设备。由 CPU Host 端控制整个程序的执行流程,FPGA Device 端则作为异构加速的一种方式。异构架构,有助于解放 CPU,将 CPU 不擅长的处理方式,下发到 Device 端处理。目前典型的异构 Device 有:GPU、Intel Phi、FPGA。

OpenCL 是一个用于异构平台编程的框架,主要的异构设备有 CPU、GPU、DSP、FPGA以及一些其它的硬件加速器。OpenCL 基于 C99 来开发设备端代码,并且提供了相应的 API 可以调用。OpenCL 提供了标准的并行计算的接口,以支持任务并行和数据并行的计算方式。

OpenCL 案例分析

这里采用 Altera 官网的矩阵乘法案例进行分析。可以通过如下链接下载案例:Altera OpenCL Matrix Multiplication

代码结构如下:

  1. .|-- common| |-- inc| | `-- AOCLUtils| | |-- aocl_utils.h| | |-- opencl.h| | |-- options.h| | `-- scoped_ptrs.h| |-- readme.css| `-- src| `-- AOCLUtils| |-- opencl.cpp| `-- options.cpp`-- matrix_mult

  2. |-- Makefile

  3. |-- README.html

  4. |-- device

  5. | `-- matrix_mult.cl

  6. `-- host

  7. |-- inc

  8. | `-- matrixMult.h

  9. `-- src

  10. `-- main.cpp

其中,和 FPGA 相关的代码是 matrix_mult.cl ,该部分代码描述了 kernel 函数,这部分函数会通过编译器生成 RTL 代码,然后 map 到 FPGA 电路中。

kernel 函数的定义如下:

  1. __kernel

  2. __attribute((reqd_work_group_size(BLOCK_SIZE,BLOCK_SIZE,1)))

  3. __attribute((num_simd_work_items(SIMD_WORK_ITEMS)))void matrixMult( __global float *restrict C,

  4. __global float *A,

  5. __global float *B,

  6. int A_width,

  7. int B_width)

模式比较固定,需要注意的是__global 指明从 CPU 传过来的数据,存放到全局内存中,可以是 FPGA 片上存储资源,DDR,QDR 等,这个视 FPGA 的 OpenCL BSP 驱动,会有所区别。num_simd_work_items 用于指明 SIMD 的宽度。reqd_work_group_size 指明了工作组的大小。这些概念,可以参考 OpenCL 的使用手册。

函数实现如下:

  1. // 声明本地存储,暂存数组的某一个 BLOCK__local float A_local[BLOCK_SIZE][BLOCK_SIZE];

  2. __local float B_local[BLOCK_SIZE][BLOCK_SIZE];// Block indexint block_x = get_group_id(0);int block_y = get_group_id(1);// Local ID index (offset within a block)int local_x = get_local_id(0);int local_y = get_local_id(1);// Compute loop boundsint a_start = A_width * BLOCK_SIZE * block_y;int a_end = a_start + A_width - 1;int b_start = BLOCK_SIZE * block_x;float running_sum = 0.0f;for (int a = a_start, b = b_start; a <= a_end; a += BLOCK_SIZE, b += (BLOCK_SIZE * B_width))

  3. { // 从 global memory 读取相应 BLOCK 数据到 local memory

  4. A_local[local_y][local_x] = A[a + A_width * local_y + local_x];

  5. B_local[local_x][local_y] = B[b + B_width * local_y + local_x]; // Wait for the entire block to be loaded.

  6. barrier(CLK_LOCAL_MEM_FENCE); // 计算部分,将计算单元并行展开,形成乘法加法树

  7. #pragma unroll

  8. for (int k = 0; k < BLOCK_SIZE; ++k)

  9. {

  10. running_sum += A_local[local_y][k] * B_local[local_x][k];

  11. } // Wait for the block to be fully consumed before loading the next block.

  12. barrier(CLK_LOCAL_MEM_FENCE);

  13. }// Store result in matrix CC[get_global_id(1) * get_global_size(0) + get_global_id(0)] = running_sum;

采用 CPU 模拟仿真 FPGA

对其进行仿真,不需要 programer 关心具体的时序是怎么走的,只需要验证逻辑功能就可以,Altera OpenCL SDK 提供了 CPU 仿真 Device 设备的功能,采用如下方式进行:

#Togeneratea.aocxfilefordebuggingthattargetsaspecificacceleratorboard$aoc-march=emulatordevice/matrix_mult.cl-obin/matrix_mult.aocx--fp-relaxed--fpc--no-interleavingdefault--board#GenerateHostexe.$make#Toruntheapplication$envCL_CONTEXT_EMULATOR_DEVICE_ALTERA=8./bin/host-ah=512-aw=512-bw=512

上述脚本中,通过-march=emulator 设置创建一个可用于 CPU debug 的设备可执行文件。-g 添加调试 flag。—board 用于创建适配该设备的 debugging 文件。CL_CONTEXT_EMULATOR_DEVICE_ALTERA 为用于 CPU 仿真的设备数量。

当执行上述脚本后,输出如下:

  1. $ env CL_CONTEXT_EMULATOR_DEVICE_ALTERA=8 ./bin/host -ah=512 -aw=512 -bw=512Matrix sizes:

  2. A: 512 x 512

  3. B: 512 x 512

  4. C: 512 x 512Initializing OpenCL

  5. Platform: Altera SDK for OpenCL

  6. Using 8 device(s)

  7. EmulatorDevice : Emulated Device

  8. ...

  9. EmulatorDevice : Emulated Device

  10. Using AOCX: matrix_mult.aocx

  11. Generating input matrices

  12. Launching for device 0 (global size: 512, 64)

  13. ...

  14. Launching for device 7 (global size: 512, 64)



  15. Time: 5596.620 ms

  16. Kernel time (device 0): 5500.896 ms

  17. ...

  18. Kernel time (device 7): 5137.931 ms



  19. Throughput: 0.05 GFLOPS



  20. Computing reference output

  21. Verifying

  22. Verification: PASS

通过仿真时候设置 Device = 8,模拟 8 个设备运行 (512, 512) * (512, 512) 规模的矩阵,最终验证正确。接下来就可以将其真正编译到 FPGA 设备上后运行。

FPGA 设备上运行矩阵乘

这个时候,真正要将代码下载到 FPGA 上执行了,这时候,只需要做一件事,那就是用 OpenCL SDK 提供的编译器,将*.cl 代码适配到 FPGA 上,执行编译命令如下:

$ aoc device/matrix_mult.cl -o bin/matrix_mult.aocx --fp-relaxed --fpc --no-interleaving default  --board 

这个过程比较慢,一般需要几个小时到10几个小时,视 FPGA 上资源大小而定。(目前这部分时间太长暂时无法解决,因为这里的编译,其实是在行程一个能够正常工作的电路,软件会进行布局布线等工作)

等待编译完成后,将生成的 matrix_mult.aocx文件烧写到 FPGA 上就 ok 啦。

烧写的命令如下:

$aoclprogrammatrix_mult.aocx

这时候,大功告成,可以运行 host 端程序了:

  1. $ ./host -ah=512 -aw=512 -bw=512Matrix sizes:

  2. A: 512 x 512

  3. B: 512 x 512

  4. C: 512 x 512Initializing OpenCL

  5. Platform: Altera SDK for OpenCL

  6. Using 1 device(s)

  7. : Altera OpenCL QPI FPGA

  8. Using AOCX: matrix_mult.aocx

  9. Generating input matrices

  10. Launching for device 0 (global size: 512, 512)



  11. Time: 2.253 ms

  12. Kernel time (device 0): 2.191 ms



  13. Throughput: 119.13 GFLOPS



  14. Computing reference output

  15. Verifying

  16. Verification: PASS

可以看到,矩阵乘法能够在 FPGA 上正常运行,吞吐大概在 119GFlops 左右。

小结

从上述的开发流程,OpenCL 大大的解放了 FPGAer 的开发周期,并且对于软件开发者,也比较容易上手。这是他的优势,但是目前开发过程中,还是存在一些问题,如:编译器优化不足,相比 RTL 写的性能存在差距;编译到 Device 端时间太长。不过这些随着行业的发展,一定会慢慢的进步。





扫描二维码获取

更多精彩

FPGA设计论坛





欢迎关注至芯科技

至芯官网:www.zxopen.com

至芯科技技术论坛:www.fpgaw.com

至芯科技淘宝网址:

https://zxopen.taobao.com

至芯科技FPGA初级课程(B站):

https://space.bilibili.com/521850676

至芯科技FPGA在线课程(腾讯课堂):

https://zxopenbj.ke.qq.com/

至芯科技-FPGA 交流群(QQ):282124839

更多资料下载欢迎注册http://www.fpgaw.com

扫码加微信回复加群

邀请您加入FPGA学习交流群




欢迎加入至芯科技FPGA微信学习交流群,这里有一群优秀的FPGA工程师、学生、老师、这里FPGA技术交流学习氛围浓厚、相互分享、相互帮助、叫上小伙伴一起加入吧!

点个在看你最好看



原文标题:FPGA之异构计算

文章出处:【微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21320

    浏览量

    593194

原文标题:FPGA之异构计算

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    FPGA异构计算架构的深度对比研究

    FPGA本质是一种可编程的芯片。可以把硬件设计重复烧写在它的可编程存储器里,从而使FPGA芯片可以执行不同的硬件设计和功能。
    发表于 04-01 14:53 75次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>异构计算</b>架构的深度对比研究

    高通NPU和异构计算提升生成式AI性能 

    异构计算的重要性不可忽视。根据生成式AI的独特需求和计算负担,需要配备不同的处理器,如专注于AI工作负载的定制设计的NPU、CPU和GPU。
    的头像 发表于 03-06 14:15 221次阅读

    科学计算与Julia技术研讨会 | 张先轶:从OpenBLAS到异构计算软件栈

    蓬勃发展,新兴科学计算语言不断涌现,Julia以其高性能、动态性成为其中的佼佼者。 12月9日上午1020 ,澎峰科技创始人 张先轶博士 将 在 主论坛:Julia与数字化和AI 上 作 “ 从OpenBLAS到异构计算软件栈” 主题演讲,期待与大家见面 ! 研讨会完整详
    的头像 发表于 11-30 19:35 406次阅读
    科学<b class='flag-5'>计算</b>与Julia技术研讨会 | 张先轶:从OpenBLAS到<b class='flag-5'>异构计算</b>软件栈

    什么是异构集成?什么是异构计算异构集成、异构计算的关系?

    异构集成主要指将多个不同工艺节点单独制造的芯片封装到一个封装内部,以增强功能性和提高性能。
    的头像 发表于 11-27 10:22 2941次阅读
    什么是<b class='flag-5'>异构</b>集成?什么是<b class='flag-5'>异构计算</b>?<b class='flag-5'>异构</b>集成、<b class='flag-5'>异构计算</b>的关系?

    国产FPGA简介

    、智能汽车、电子设备、电力与电源管理、人工智能。 目标市场:金融、电信、政务、汽车、工业互联、物联网等领域。 京微齐力 核心技术:AiPGA芯片(AI in FPGA)、异构计算HPA芯片
    发表于 11-20 16:20

    异构计算为什么会异军突起?基于FPGA异构计算讨论

    简单的介绍几个概念,同道中人可以忽略这一段。云计算取代传统IT基础设施已经基本成为业界共识和不可阻挡的趋势。
    发表于 10-26 10:04 252次阅读
    <b class='flag-5'>异构计算</b>为什么会异军突起?基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>异构计算</b>讨论

    异构时代:CPU与GPU的发展演变

    异构计算是指在一个系统中使用不同类型的处理器来执行不同的计算任务,以提高性能,效率和可靠性。随着摩尔定律的放缓,单一类型的处理器已经难以满足日益增长的运算需求。与此同时,不同类型的处理器具有各自
    的头像 发表于 10-24 10:17 564次阅读
    <b class='flag-5'>异构</b>时代:CPU与GPU的发展演变

    请问模型推理只用到了kpu吗?可以cpu,kpu,fft异构计算吗?

    请问模型推理只用到了kpu吗?可以cpu,kpu,fft异构计算吗?
    发表于 09-14 08:13

    中科驭数受邀在招商银行金融科技论坛作异构计算主题分享 解码金融科技先进算力构建之路

    8月25日,2023招银浦江金融科技论坛正式召开。中科驭数高级副总裁张宇受邀在资管科技分论坛发表《金融行业先进异构算力底座构建之路》的主题演讲,与参会嘉宾分享了当前计算系统的发展趋势以及如何通过异构
    的头像 发表于 08-25 18:20 589次阅读
    中科驭数受邀在招商银行金融科技论坛作<b class='flag-5'>异构计算</b>主题分享 解码金融科技先进算力构建之路

    新一代计算架构超异构计算技术是什么 异构走向超异构案例分析

    异构计算架构是一种将不同类型和规模的硬件资源,包括CPU、GPU、FPGA等,进行异构集成的方法。它通过独特的软件和硬件协同设计,实现了计算资源的灵活调度和优化利用,从而大大提高了
    发表于 08-23 09:57 456次阅读
    新一代<b class='flag-5'>计算</b>架构超<b class='flag-5'>异构计算</b>技术是什么 <b class='flag-5'>异构</b>走向超<b class='flag-5'>异构</b>案例分析

    异构计算场景下构建可信执行环境

    本文转载自 OpenHarmony TSC 《峰会回顾第4期 | 异构计算场景下构建可信执行环境》 演讲嘉宾 | 金意儿 回顾整理 | 廖涛 排版校对 | 李萍萍 嘉宾简介 金意儿,华为可信计算
    发表于 08-15 17:35

    异构计算、智能座舱SoC,多款搭载Imagination IP 产品亮相2023慕尼黑上海电子展

    搭载  IMG IP 的新产品也亮相展会。   京微齐力    京微齐力是国内较早进入自主研发、规模生产、批量销售通用FPGA芯片及新一代异构可编程计算芯片的企业之一。其产品将 FPGA
    的头像 发表于 07-31 09:35 456次阅读
    <b class='flag-5'>异构计算</b>、智能座舱SoC,多款搭载Imagination IP 产品亮相2023慕尼黑上海电子展

    异构计算的初步创新

    更 高,x16带宽(双向)从64 GB/s提 升到了128 GB/s;目前规范制定已迭 代至6.0版本,带宽再翻倍。 异构计算的初步创新:在
    的头像 发表于 06-19 11:26 460次阅读
    <b class='flag-5'>异构计算</b>的初步创新

    PrimeSimSPICE:异构计算模型实现数量级性能突破

    随着对更高计算性能的需求不断增加,HPC 行业正朝着异构计算模型发展,其中 GPU 和 CPU 协同工作以执行通用计算任务。在这种异构计算模型中,GPU 充当 CPU 的加速器,以减轻
    的头像 发表于 05-24 16:53 589次阅读
    PrimeSimSPICE:<b class='flag-5'>异构计算</b>模型实现数量级性能突破

    构建面向异构算力的边缘计算云平台

    数据又消费数据,再慢慢到设备与设备之间的信息互联,万物互联的时代已然到来。 在万物互联时代,需要计算的数据越来越多,需求在不断的变化,异构计算能够充分发挥 CPU/GPU 在通用计算上的灵活性,及时响应数据处理需求,搭 配上
    发表于 05-18 17:15 0次下载
    构建面向<b class='flag-5'>异构</b>算力的边缘<b class='flag-5'>计算</b>云平台