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