克雷YMP向量電腦的處理器板
**向量处理器**，又称数组处理器，是一种实现了直接操作一维数组（向量）指令集的中央处理器（CPU）。與之相比，标量处理器一次只能处理一个数据。向量处理器可以在特定工作环境中极大地提升性能，尤其是在数值模拟或者相似领域。向量处理器最早出现于1970年代早期，并在1970年代到1990年代期间主导了超级计算机的设计方向，尤其是多个克雷（Cray）平台。由于90年代末标量处理器设计性能提升，而價格快速下降，基于向量处理器的超级计算机逐渐让出了主导地位。

现在，绝大多数商业化的CPU实现都能够提供某种形式的向量处理的指令，用来处理多个（向量化的）数据集，也就是所谓的SIMD（单一指令、多重数据）。常见的例子有 VIS, MMX, SSE, AltiVec 和 AVX。向量处理技术也能在游戏主机硬件和图形加速硬件上看到。在2000年，IBM、东芝和索尼合作开发了Cell处理器，集成了一个标量处理器和八个向量处理器，应用在索尼的PlayStation 3游戏机和其他一些产品中。

其他CPU设计还可能包括多重指令处理多重（向量化的）数据集的技术——也就是所谓的MIMD（多重指令、多重数据）——并实现了VLIW。此类设计通常用于特定应用场合，而不是面向通用计算机的市场化产品。在富士通的 FR-V VLIW/vector 处理器中，组合使用了两种技术。

基本特点
----

平行向量处理机最大的特点是系统中的CPU是专门定制的向量处理器（VP）。系统还提供共享存储器以及与VP相连的高速交叉开关。

来自现实世界的例子: x86 架构中的向量指令应用
-------------------------

```
// 改自英文維基 Vector\_processor
//SSE simd function for vectorized multiplication of 2 arrays with single-precision floatingpoint numbers
//1st param pointer on source/destination array, 2nd param 2. source array, 3rd param number of floats per array
void mul\_asm(float\* out, float\* in, unsigned int leng){
 unsigned int count, rest;

 //compute if array is big enough for vector operation
 rest = (leng\*4)%16;
 count = (leng\*4)-rest;

 // vectorized part; 4 floats per loop iteration
 if (count>0){
 \_\_asm \_\_volatile\_\_ (".intel\_syntax noprefix\n\t"
 "loop: \n\t"
 "sub ecx,16 \n\t" // decrease address pointer by 4 floats
 "movups xmm0,[ebx+ecx] \n\t" // loads 4 floats in first register (xmm0)
 "movups xmm1,[eax+ecx] \n\t" // loads 4 floats in second register (xmm1)
 "mulps xmm0,xmm1 \n\t" // multiplies both vector registers
 "movups [eax+ecx],xmm0 \n\t" // write back the result to memory
 "jnz loop \n\t"
 ".att\_syntax prefix \n\t"
 : : "a" (out), "b" (in), "c"(count), "d"(rest): "xmm0","xmm1");
 }

 // scalar part; 1 float per loop iteration
 if (rest!=0)
 {
 \_\_asm \_\_volatile\_\_ (".intel\_syntax noprefix\n\t"
 "add eax,ecx \n\t"
 "add ebx,ecx \n\t"

 "rest: \n\t"
 "sub edx,4 \n\t"
 "movss xmm0,[ebx+edx] \n\t" // load 1 float in first register (xmm0)
 "movss xmm1,[eax+edx] \n\t" // load 1 float in second register (xmm1)
 "mulss xmm0,xmm1 \n\t" // multiplies both scalar parts of registers
 "movss [eax+edx],xmm0 \n\t" // write back the result\n\t"
 "jnz rest \n\t"
 ".att\_syntax prefix \n\t"
 : : "a" (out), "b" (in), "c"(count), "d"(rest): "xmm0","xmm1");
 }
 return;
}

```

参阅
--

* 并行计算

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
并行计算 |
| --- |
|  |
| 概论 | 
* 并发计算
* 分布式计算
* 并行计算
* 大规模并行处理机
* 雲端運算
* 高性能计算
* 多元處理
* 大規模多核心處理器（英语：）
* GPGPU
* 计算机网络
* Systolic array（英语：）

 |
|  |
| 层级 | 
* 位元
* 指令
* 线程
* 任务
* 数据
* 内存
* 循环（英语：）
* 流水线

 |
|  |
| 多线程 | 
* 时间（英语：）
* 同时多线程（SMT）
* 投机（英语：）（SpMT）
* 抢占式
* 协作
* 集群多线程（CMT）
* 硬件侦测

 |
|  |
| 理论 | 
* PRAM模型
* 并行算法分析（英语：）
* 阿姆达尔定律
* Gustafson's law（英语：）
* Cost efficiency（英语：）
* Karp–Flatt metric（英语：）
* 减速（英语：）
* 加速比

 |
|  |
| 元素 | 
* 行程
* 线程
* 纖程
* 指令窗口（英语：）

 |
|  |
| 协调 | 
* 多元處理
* 内存一致性（英语：）
* 快取一致性
* 高速缓存失效（英语：）
* 屏障
* 同步
* 应用程序检查点（英语：）

 |
|  |
| 编程 | 
* 串流處理
* 数据流处理（英语：）
* 模型
	+ 隐式并行（英语：）
	+ 显式并行（英语：）
	+ 并发性
* 非阻塞算法（英语：）

 |
|  |
| 硬件 | 
* 費林分類法
	+ 單指令流單數據流
	+ 单指令流多数据流
	+ 单指令多线程（英语：）（SIMT）
	+ 多指令流單數據流
	+ 多指令流多数据流
* 数据流架构（英语：）
* 指令管線化
* 超純量
* 并行向量处理机
* 多处理器
	+ 对称
	+ 非对称
* 内存
	+ 共享
	+ 分布式内存（英语：）
	+ 分布式共享
	+ UMA
	+ NUMA
	+ COMA（英语：）
* 大规模并行处理机
* 计算机集群
* 网格计算

 |
|  |
| API | 
* Ateji PX（英语：）
* Boost.Thread
* Charm++（英语：）
* Cilk
* Coarray Fortran（英语：）
* CUDA
* Dryad（英语：）
* C++ AMP
* Global Arrays（英语：）
* MPI
* OpenMP
* OpenCL
* HMPP开放标准
* OpenACC
* TPL（英语：）
* PLINQ（英语：）
* 并行虚拟机（英语：）（PVM）
* POSIX线程
* RaftLib（英语：）
* UPC
* TBB（英语：）

 |
|  |
| 问题 | 
* 软件闭锁（英语：）
* 可缩放性
* 競爭危害
* 死锁
* 活锁
* 饥饿（英语：）
* 确定性算法
* 并行变慢（英语：）

 |
|  |
| 
* 分类 分類：并行计算
* 维基共享资源上的相關多媒體資源：向量处理器

 |

 |