我感兴趣的是,工作负载的百分比是多少,这些工作负载几乎不可能被放入硬件加速器中。当越来越多的任务能够适应特定领域的加速器时,我想知道是否可能有一些对加速器没有帮助的任务呢?简单地说,哪些任务不太可能与加速器兼容?
希望有一个关于这个问题的资源的指点。
发布于 2022-03-05 12:27:28
因此,您在原来的帖子中有以下问题:
问题
答案
当然有可能。首先,硬件加速器上需要加速的工作量不应涉及以下内容:
虽然对上述各点进行解释会使这篇文章过于冗长,但我能解释的很少.由于硬件加速器在硅上有固定的资源集,不支持内存资源的动态创建和释放,因此不支持动态内存分配。同样,只有在编译时可以确定指针对象时,才支持动态多态。不应该有系统调用,因为这些操作与在操作系统上执行某些任务有关。因此,不支持OS操作,例如文件读/写或像时间和日期这样的OS查询。
尽管如此,不太可能与加速器兼容的工作负载主要是通信密集型内核。与CPU执行相比,这种通信密集型内核常常导致严重的数据传输开销,CPU-FPGA或CPU-GPU通信时间测量可能会检测到这种开销。
为了更好地理解,让我们以下面的例子为例:
通信密集型广度优先搜索(BFS)
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% )花在卷积函数上。输入的数据相对较少。这些卷积是令人尴尬的平行的。这使得它们成为移动到硬件加速器的理想工作负载。
让我们以另一个示例为例,展示硬件加速的完美工作负载:
计算密集广义矩阵乘法()
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%。因此,理想的工作负载不仅在算法上应该是理想的工作负载,事实上,它还应该对系统的整体运行时做出重大贡献。
https://stackoverflow.com/questions/71355161
复制相似问题