首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以放入硬件加速器的工作负载限制

可以放入硬件加速器的工作负载限制
EN

Stack Overflow用户
提问于 2022-03-04 17:32:22
回答 1查看 110关注 0票数 1

我感兴趣的是,工作负载的百分比是多少,这些工作负载几乎不可能被放入硬件加速器中。当越来越多的任务能够适应特定领域的加速器时,我想知道是否可能有一些对加速器没有帮助的任务呢?简单地说,哪些任务不太可能与加速器兼容?

希望有一个关于这个问题的资源的指点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-05 12:27:28

因此,您在原来的帖子中有以下问题:

问题

  • 我想知道是否可能有一些对加速器没有帮助的任务?简单地说,哪些任务不太可能与加速器兼容?

答案

当然有可能。首先,硬件加速器上需要加速的工作量不应涉及以下内容:

  • 动态多态与动态内存分配
  • 运行时类型信息(RTTI)
  • 系统调用
  • .(更多取决于硬件加速器)

虽然对上述各点进行解释会使这篇文章过于冗长,但我能解释的很少.由于硬件加速器在硅上有固定的资源集,不支持内存资源的动态创建和释放,因此不支持动态内存分配。同样,只有在编译时可以确定指针对象时,才支持动态多态。不应该有系统调用,因为这些操作与在操作系统上执行某些任务有关。因此,不支持OS操作,例如文件读/写或像时间和日期这样的OS查询。

尽管如此,不太可能与加速器兼容的工作负载主要是通信密集型内核。与CPU执行相比,这种通信密集型内核常常导致严重的数据传输开销,CPU-FPGA或CPU-GPU通信时间测量可能会检测到这种开销。

为了更好地理解,让我们以下面的例子为例:

通信密集型广度优先搜索(BFS)

代码语言:javascript
复制
 1  procedure BFS(G, root) is
 2      let Q be a queue
 3      label root as explored
 4      Q.enqueue(root)
 5      while Q is not empty do
 6          v := Q.dequeue()
 7          if v is the goal then
 8              return v
 9          for all edges from v to w in G.adjacentEdges(v) do
10              if w is not labeled as explored then
11                  label w as explored
12                  Q.enqueue(w)

上述伪码是著名的面包优先搜索(BFS)。为什么它不是加速的好人选?因为它遍历图中的所有节点而不进行任何重要的计算。因此,与计算密集型相比,它具有极大的通信强度。此外,对于像BFS这样的数据驱动算法,输入的形状和结构实际上可以决定运行时的特性,比如局部性分支行为,这使得它不太适合硬件加速。

  • 现在问题出现了,为什么我要专注于计算密集型和通信密集型?

由于您已经在您的文章中标记了FPGA,我可以向您解释这个关于FPGA的概念。例如,在使用PCIe与PCIe连接的给定系统中,通过基于PCIe的直接存储器访问(DMA),计算出从主机内存到设备内存的数据移动所需的PCIe传输时间。

对于通信有界的工作负载,PCIe传输时间是滤除FPGA加速的一个重要因素。因此,上述BFS可以显示严重的PCIe传输开销,因此,不兼容加速。

另一方面,将目标识别算法族作为一种深度神经网络加以实现。如果你通过这些算法,你会发现大量的时间(可能超过90% )花在卷积函数上。输入的数据相对较少。这些卷积是令人尴尬的平行的。这使得它们成为移动到硬件加速器的理想工作负载。

让我们以另一个示例为例,展示硬件加速的完美工作负载:

计算密集广义矩阵乘法()

代码语言:javascript
复制
void gemm(TYPE m1[N], TYPE m2[N], TYPE prod[N]){
    int i, k, j, jj, kk;
    int i_row, k_row;
    TYPE temp_x, mul;

    loopjj:for (jj = 0; jj < row_size; jj += block_size){
        loopkk:for (kk = 0; kk < row_size; kk += block_size){
            loopi:for ( i = 0; i < row_size; ++i){
                loopk:for (k = 0; k < block_size; ++k){
                    i_row = i * row_size;
                    k_row = (k  + kk) * row_size;
                    temp_x = m1[i_row + k + kk];
                    loopj:for (j = 0; j < block_size; ++j){
                        mul = temp_x * m2[k_row + j + jj];
                        prod[i_row + j + jj] += mul;
                    }
                }
            }
        }
    }
}

上面的代码示例是广义矩阵乘(GEMM)。它是线性代数、机器学习、统计等许多领域中常见的算法。此代码中的矩阵乘法通常使用阻塞循环结构计算。在转移到下一个块之前,对算法进行通勤以重用一个块中的所有元素,显着地提高了内存局部性。因此,它是一个非常计算密集和完美的加速候选。

因此,仅举几个例子,我们可以得出以下是硬件加速的决定因素:

  • 你的工作量
  • 工作负载访问的数据,
  • 你的工作量有多平行?
  • 可用于加速的底层硅
  • 通信信道的带宽和延迟。

不要忘记Amdahl定律

即使您已经找到了正确的工作负载,这是一个理想的候选硬件加速,斗争并没有就此结束。为什么?因为著名的Amdahl定律出现了。也就是说,您可能可以显着地加快一个工作负载,但是如果它只占应用程序运行时的2%,那么即使您无限地加快了它(将运行时间提高到0),在系统级别上,您也只能将整个应用程序的速度提高2%。因此,理想的工作负载不仅在算法上应该是理想的工作负载,事实上,它还应该对系统的整体运行时做出重大贡献。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71355161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档