7.2 1D PARALLEL CONVOLUTION—A BASIC ALGORITHM

2024-01-09 18:12

本文主要是介绍7.2 1D PARALLEL CONVOLUTION—A BASIC ALGORITHM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

正如我们在第7.1节中提到的,所有输出(P)元素的计算可以在卷积中并行完成。这使得卷积成为并行计算的理想问题。根据我们在矩阵-矩阵乘法方面的经验,我们可以快速编写一个简单的并行卷积内核。为了简单起见,我们将从1D卷积开始。
在这里插入图片描述
第一步是定义内核的主要输入参数。我们假设1D卷积内核收到五个参数:指向输入数组N的指针,指向输入掩码M的指针,指向输出数组P的指针,掩码Mask_Width的大小,以及输入和输出数组宽度的大小。因此,我们有以下设置:

__global__ void convolution_1D_basic_kernel(float *N, float *M,
float *P,int Mask_Width, int Width) {// kernel body
}

第二步是确定并实现线程到输出元素的映射。由于输出数组是ID,一个简单而好的方法是将线程组织成一个1D网格,并将每个线程放在网格中来计算一个输出元素。读者应该认识到,就输出元素而言,这与向量加法示例的安排相同。因此,我们可以使用以下语句从每个线程的块索引、块尺寸和线程索引中计算输出元素索引:

int i = blockIdx.x*blockDim.x + threadIdx.x;

一旦我们确定了输出元素索引,我们就可以使用输出元素索引的偏移量访问输入N元素和掩码M元素。为了简单起见,我们假设Mask_Width是一个奇数,卷积是对称的,即Mask_Width是2*n + 1,其中n是整数。P[i]的计算将使用 N[i-n], N[i-n+1],…, N[i-1], N[i], N[i+1], N[i+n-1], N[i+n]。我们可以使用一个简单的循环在内核中进行此计算:
在这里插入图片描述
变量Pvalue将允许将所有中间结果累积在寄存器中,以节省DRAM带宽。for循环累积了从相邻元素到输出P元素的所有贡献。循环中的if语句测试使用的任何输入N元素是否是幽灵单元,位于N数组的左侧或右侧。由于我们假设0值将用于幽灵细胞,我们可以简单地跳过幽灵细胞元素及其相应的N个元素的乘法和累积。循环结束后,我们将P值释放到输出P元素中。我们现在在图7.6.中有一个简单的内核。
在这里插入图片描述
我们可以对图7.6中的内核进行两项观察。首先,将有控制流发散计算P数组左端或右端附近的输出P元素的线程将处理幽灵单元格。正如我们在第7.1节中展示的那样,每个相邻的线程都会遇到不同数量的幽灵细胞。因此,在if声明中,它们都将是一些不同的决定。计算P[0]的线程将跳过大约一半的乘法累积语句,而计算P[1]的那个会少跳过一次,以及以此为由。控制发散的成本将取决于输入数组大小的宽度和掩码大小的mask_width。对于大型输入阵列和小型掩码,控制发散只发生在一小部分输出元素中,这将保持控制发散的影响很小。由于卷积通常应用于大型图像和空间数据,我们通常期望收敛的效果是适度的或微不足道的。

一个更严重的问题是内存带宽。在内核中,浮点算术计算与全局内存访问的比率仅约为1.0。正如我们在矩阵-矩阵乘法示例中看到的,这个简单的内核只能以峰值性能的一小部分运行。在接下来的两节中,我们将讨论减少全局内存访问次数的两个关键技术。

这篇关于7.2 1D PARALLEL CONVOLUTION—A BASIC ALGORITHM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/587991

相关文章

OpenStack Victoria版——7.2计算节点-Neutron网络服务组件

7.2计算节点-Neutron网络服务组件 更多步骤:OpenStack Victoria版安装部署系列教程 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版 离线安装部署系列教程(全) OpenStack Train版 离线安装部署系列教程(全) 文章目录 一、安装相关软件二、配置公共组件三、配置网络

查看Excel 中的 Visual Basic 代码,要先设置excel选项

1. excel VB的简单介绍 百度安全验证 2.excel选项设置 excel表格中在选项->自定义功能区域,选择开发工具,visual baisc/查看代码,即可看到代码。 3.excel已经设置,可以直接查看

【tensorflow 使用错误】tensorflow2.0 过程中出现 Error : Failed to get convolution algorithm

如果在使用 tensorflow 过程中出现 Error : Failed to get convolution algorithm ,这是因为显卡内存被耗尽了。 解决办法: 在代码的开头加入如下两句,动态分配显存 physical_device = tf.config.experimental.list_physical_devices("GPU")tf.config.experiment

翻译论文的关键部分 | Parallel Tiled QR Factorization for Multicore Architectures

SSRFB DTSQT2 DLARFB DGEQT2 1, 对角子矩阵分解 DGEQT2 这个例程被开发出来,用于针对对角Tile子矩阵: ,执行不分块的QR分解。 这个运算产生: 一个上三角矩阵 一个酉下三角矩阵,这个矩阵包含 b 个 Householder 反光面、 一个上三角矩阵 ,在WY技术中,这个矩阵被定义用来累计Householder变换。 和 能够写进 所占据的内存空间,

CodeForces 404E Maze 1D

题意: 一个机器人在数轴上的0点  给一串指令机器人按照指令走  为了使机器人最后一步走到一个从来没来过的位置  我们可以在数轴上放石头  每次机器人被石头卡住他就跳过当前的那个指令  问  最少使用石头前提下  一共几种放石头方法 思路: 很容易想到如果最后一个指令是L  那么机器人一定会停在0点的左边  因为如果停在右边  最后一步一定走在之前来过的位置上  同理最后一个指令是R

CodeForces 404D Minesweeper 1D

题意: 一个字符串  ?可以被替换  *表示雷  数字表示旁边雷的个数  (就是扫雷游戏…)  问  这个串有几种可能的结构 思路: 画出所有转移dp就好了  画的思路就是 当前位置是什么符号  它前面是什么符号或符号组合 确定了前面的东西后  是不是也对后一位有要求(比如01后面一个必须是*) 代码: #include<cstdio>#include<cstrin

纪念一下自己的Coursera Princeton Algorithm的课程第一个assignment

今天终于完成了第一个Union-Find的assignment,之前觉得特别的难,可是最后自己也搞定了。而且是100%满分。 自己后来plot了一下自己的分数,也许这就是学习曲线吧。刚开始不会,到后来中期显著提高,但是要到100%,那就要经历更多的波折,甚至是下降都有可能。最后才能达到100%满分。 我觉得最有用的还是下面这段源代码: /*************************

Basic Calculator 总结

Basic Calculator 思路:stack中间存数,遇见+,-都当符号位,push num或者-num进去;最后相加;重要的是如何处理括号,那么这里一种方法是用递归调用;count左右括号,如果为0,那么就是一个反括号的位置了,那么 //(      ) //j......i; substring(j + 1, i); 这题的通用解法,可以扩展到二三题; class Solutio

[Algorithm][综合训练][栈和排序][加减]详细讲解

目录 1.栈和排序1.题目链接2.算法原理详解 && 代码实现 2.加减1.题目链接2.算法原理详解 && 代码实现 1.栈和排序 1.题目链接 栈和排序 2.算法原理详解 && 代码实现 解法:栈 + 贪心 -> 每次尽可能先让当前需要的最大值弹出去vector<int> solve(vector<int>& a) {int n = a.size();vect

[Algorithm][综合训练][四个选项][接雨水]详细讲解

目录 1.四个选项1.题目链接2.算法原理详解 && 代码实现 2.接雨水1.题目链接2.算法原理详解 && 代码实现 1.四个选项 1.题目链接 四个选项 2.算法原理详解 && 代码实现 解法:DFS(暴搜) + 剪枝 + Hash 剪枝: 填某个数的时候,要看看还有没有剩余次数填某个数的时候,符不符合若干题的选项必须相同 #include <iostr