计算机上的高性能计算,你了解多少?
计算在数学上的概念: 计算是一种行为,通过已知量的可能的组合,获得新的量。计算的本质是集合之间的映射。
个人粗浅直白的理解是: 输入一个或多个数据,经过处理,输出一个或多个数据。如 1 + 2 就是一个计算机,输入 2 个数据,输出 1 个数据 3。
那到这里就会有很多疑问,在计算机上:
高性能计算的概念是什么?
全部的普通计算都能转成高性能计算实现么?如果不是的话,那哪些类型的计算可以呢?
我们需要做哪些事情,来实现高性能计算?
Android 框架或者是否存在第三方库为我们做了相关的工作
高性能计算的概念
高性能计算:通常使用很多处理器(作为单个机器的一部分)或者某一集群中组织的几台计算机(作为单个计算资源操作)的计算系统和环境。
在移动端,我们可以认为是通过同时启用移动设备的 CPU 和 GPU 构成的异构计算资源,进行协同计算。
计算模型类型
从数据流和指令的角度把计算模型分为 4 类(费林分类法)
单指令单数据流 (SISD): 并行计算的模型,典型例子就是单核 CPU,所有数据都被一个处理器顺次处理,某一时刻只能使用一个指令。
单指令多数据流 (SIMD): 多个不同的数据同时被相同的执行、指令集或者算法处理,是 GPU 的计算模型。
多指令单数据流 (MISD): 在同一个数据流上执行不同的指令。
多指令多数据流 (MIMD): 是多核 CPU 的计算模型。
本文内容讨论的高性能计算则主要是在 SIMD 的基础上讨论,但这里并不需要严格按照 SIMD,只需要计算流程中的一部分内容符合 SIMD 我们就认为该实现的过程就是一个高性能计算。
知道了计算模型的类型,我们就能知道并不是所有的计算类型都能实现为高性能计算。只有满足以下要求的算法(或者算法中的部分满足,其他部分通过 CPU 协调)才能够比较好的实现为高性能计算。
每个数据(数据包)都需要经过相同的流程来处理
数据之间并没有相干性,即某些数据的计算不依赖另外一些数据的计算结果
数据量庞大
如何实现高性能计算
这里首先了解的是图形显示流程,常用的通用计算也正是基于这个显示流程做修改而实现的。这里以 OpenGL ES 为例,其他的如 Direct3D、CG 的流程大体也相同。
其中的顶点着色器和片元着色器的处理过程,程序猿可以自行编写,且是分别在 GPU 中的顶点处理器和片元处理器(或者统一处理器)计算。
知道了这个流程,我们可以很容易联想到:
我们的高性能计算的主要算法过程是在 顶点着色器 或 片元着色器 中处理的,一般都是 片元着色器。
这个流程是用于显示,输入是顶点和纹理等数据,输出是帧缓冲,很明显并不是我们所需要的,因此我们还需要修改流程。
其中的顶点着色器和片元着色器的处理过程,程序猿可以自行编写,且是分别在 GPU 中的顶点处理器和片元处理器(或者统一处理器)计算。
性能提升效果
一个非常简单的图像处理的算法 (因为使用图像暂时效果比较明显,表达也比较容易,所以这里使用的是图像显示的 Demo,并不是说高性能计算只能用于显示相关)
算法基本流程是:
读入一张图片
光顺处理下,即将每个像素点和周围的 8 个像素点的颜色做一个平均,并将均值赋值给中间像素点
将各个像素点置灰,即将每个像素点的 rgb 值求和并取平均值
调整亮度,即将每个像素点的颜色的各通道值乘以 0.9
将像素数组取出设置给 bitmap,并设置给 ImageView
评论