哪些类型的计算可以实现高性能计算?

发布于:2022-12-10 ⋅ 阅读:(636) ⋅ 点赞:(0)

计算在数学上的概念: 计算是一种行为,通过已知量的可能的组合,获得新的量。计算的本质是集合之间的映射。

个人粗浅直白的理解是: 输入一个或多个数据,经过处理,输出一个或多个数据。如 1 + 2 就是一个计算机,输入 2 个数据,输出 1 个数据 3。

那到这里就会有很多疑问,在计算机上:

  • 高性能计算的概念是什么?
  • 全部的普通计算都能转成高性能计算实现么?如果不是的话,那哪些类型的计算可以呢?
  • 我们需要做哪些事情,来实现高性能计算?
  • Android框架或者是否存在第三方库为我们做了相关的工作

高性能计算的概念

高性能计算:通常使用很多处理器(作为单个机器的一部分)或者某一集群中组织的几台计算机(作为单个计算资源操作)的计算系统和环境。

在移动端,我们可以认为是通过同时启用移动设备的 CPU 和 GPU 构成的异构计算资源,进行协同计算。

计算模型类型

从数据流和指令的角度把计算模型分为4类(费林分类法)

  1. 单指令单数据流 (SISD): 并行计算的模型,典型例子就是单核 CPU,所有数据都被一个处理器顺次处理,某一时刻只能使用一个指令。
  2. 单指令多数据流 (SIMD): 多个不同的数据同时被相同的执行、指令集或者算法处理,是 GPU 的计算模型。
  3. 多指令单数据流 (MISD): 在同一个数据流上执行不同的指令。
  4. 多指令多数据流 (MIMD): 是多核CPU的计算模型。

本文内容讨论的高性能计算则主要是在 SIMD 的基础上讨论,但这里并不需要严格按照 SIMD,只需要计算流程中的一部分内容符合 SIMD 我们就认为该实现的过程就是一个高性能计算。

知道了计算模型的类型,我们就能知道并不是所有的计算类型都能实现为高性能计算。只有满足以下要求的算法(或者算法中的部分满足,其他部分通过CPU协调)才能够比较好的实现为高性能计算。

  1. 每个数据(数据包)都需要经过相同的流程来处理
  2. 数据之间并没有相干性,即某些数据的计算不依赖另外一些数据的计算结果
  3. 数据量庞大

如何实现高性能计算

这里首先了解的是图形显示流程,常用的通用计算也正是基于这个显示流程做修改而实现的。这里以OpenGL ES为例,其他的如Direct3D、CG的流程大体也相同。

其中的顶点着色器和片元着色器的处理过程,程序猿可以自行编写,且是分别在 GPU 中的顶点处理器和片元处理器(或者统一处理器)计算。

知道了这个流程,我们可以很容易联想到:

  1. 我们的高性能计算的主要算法过程是在 顶点着色器 或 片元着色器 中处理的,一般都是 片元着色器。
  2. 这个流程是用于显示,输入是顶点和纹理等数据,输出是帧缓冲,很明显并不是我们所需要的,因此我们还需要修改流程。

其中的顶点着色器和片元着色器的处理过程,程序猿可以自行编写,且是分别在 GPU 中的顶点处理器和片元处理器(或者统一处理器)计算。

性能提升效果

一个非常简单的图像处理的算法 (因为使用图像暂时效果比较明显,表达也比较容易,所以这里使用的是图像显示的 Demo,并不是说高性能计算只能用于显示相关)

算法基本流程是:

  • 读入一张图片
  • 光顺处理下,即将每个像素点和周围的8个像素点的颜色做一个平均,并将均值赋值给中间像素点
  • 将各个像素点置灰,即将每个像素点的rgb值求和并取平均值
  • 调整亮度,即将每个像素点的颜色的各通道值乘以0.9
  • 将像素数组取出设置给bitmap,并设置给ImageView
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到