🥦GPU(CUDA)异构众核数值计算

关键词

CUDA | C/C++ | Python | 内核 | 中值过滤 | 卷积 | 偏微分方程 | 求解器 | 迭代 | 时间积分器 | 图形分割算法 | 集群 | 广义最小残差法 | 共轭梯度法方法 | 稀疏线性系统

🏈指点迷津 | Brief

要点

  1. CUDA(C代码)图像处理:使用cutil库编辑全局内存管理算法处理CPU和GPU端之间数据传输。

    1. 实现图像的中值过滤方法,cuda代码:

      1. 通用CUDA内核方法,

      2. 3*3中值过滤

        1. 每个邻域像素使用一个寄存器并进行冒泡排序

        2. 使用最少6个寄存器数通过遗忘选择方法找到中值

        3. 使用组合遗忘选择处理每个线程 2 个输出像素值

      3. 5*5中值过滤:通过组合遗忘选择处理每个线程 2 个输出像素值

      4. 快速近似 m × n 中值滤波

    2. 实现图像的卷积处理,cuda代码:

      1. 使用硬编码掩码值实现卷积处理

      2. 使用符号内存中的掩码及其作为参数传递的半径来实现卷积运算

      3. 使用符号内存中的掩码和纹理内存中的直接数据获实现 3 * 3 卷积

      4. 在共享内存中预加载数据后实现通用卷积运算

      5. 调用 1D 卷积核之间的数据复制实现 2D 可分离卷积运算

      6. 数据预加载到共享内存后,内核实现水平和垂直一维卷积运算

  2. 开发CUDA偏微分方程求解器库文件(C++代码):矢量类,矩阵类,线性方程组的迭代求解器,迭代求解器的预处理器类,时间积分器类。

  3. CUDA集群GPU开发:

    1. 隐式/显示重叠 MPI 通信与 CUDA GPU 计算

    2. 流序列明确重叠 MPI 通信与 CUDA GPU 计算

    3. 显式重叠 MPI 通信、CUDA CPU/GPU 传输和 CUDA GPU 计算、交错计算通信迭代

    4. 使用MPI,OpenMP和CUDA异步通讯\

    5. 使用广义最小残差法和共轭梯度法方法求解稀疏线性系统

    6. 求解大型稀疏线性系统的整数分解

Python使用CUDA优化图形分割算法示例

在此,我将向您介绍一种借助 GPU 加速图割算法的方法。算法使用情景:

  1. 像素强度从背景到前景的急剧变化

  2. 前景部分不会与背景部分纠缠太多

  3. 图像不太模糊

使用 CUDA 可以将从收缩图到创建残差图的整个过程的运行时间降低到几毫秒。

图看起来像一个网格,每个节点对应于每个像素。这种矩形形状的图允许我们使用二维数组来存储有关节点和边的信息。大小为 image_width x image_length 的四个矩阵将用于存储权重。 请注意,权重表示残差图中的容量。 对于每个节点,都有指向四个不同方向的边,因此,我们使用每个矩阵来存储每个方向的权重。除了权重之外,我们还需要使用矩阵来存储节点的信息,例如剩余流和高度。

当图像很大时,CPU 上的串行推送重新标记非常慢,因此需要通过在不同节点上并行执行推送或重新标记操作来利用 GPU 的计算能力。 在推送重新标记期间,我们只需更新上面介绍的矩阵。为了避免数据依赖问题,每个节点同时向一个方向推送。这个概念被称为“wave update”,由 NVIDIA 提出。

Push功能被编写为CUDA内核。事实上,我有一个不同的推送功能用于在每个方向上推送。每个内核线程将在该行(或列,如果内核向下推送)中的接下来的 m 个节点上工作。

需要调用重新标记,以便更多节点的高度得到纠正,以推送到相邻节点,前提是其任何向外边缘上都留有剩余容量。 与 Push 中每个线程必须在多个连续节点上工作不同,我们可以使用一个线程来更新每个节点。 重新标记不必在每次迭代中进行,如果您希望每次迭代更快,您可以每两次迭代进行一次。

最终代码:

Last updated

Was this helpful?