并行向量处理机

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP






克雷YMP向量電腦的處理器板


向量处理器,又称数组处理器,是一种实现了直接操作一维数组(向量)指令集的中央处理器(CPU)。这与一次只能处理一个数据的标量处理器正相反。向量处理器可以在特定工作环境中极大地提升性能,尤其是在数值模拟或者相似领域。向量处理器最早出现于20世纪70年代早期,并在70年代到90年代期间成为超级计算机设计的主导方向,尤其是多个克雷(Cray)平台。由于90年代末标量处理器设计性能提升,而價格快速下降,基于向量处理器的超级计算机逐渐让出了主导地位。


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


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



基本特点


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



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


// 改自英文維基 http://en.wikipedia.org/wiki/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 noprefixnt"
"loop: nt"
"sub ecx,16 nt" // decrease address pointer by 4 floats
"movups xmm0,[ebx+ecx] nt" // loads 4 floats in first register (xmm0)
"movups xmm1,[eax+ecx] nt" // loads 4 floats in second register (xmm1)
"mulps xmm0,xmm1 nt" // multiplies both vector registers
"movups [eax+ecx],xmm0 nt" // write back the result to memory
"jnz loop nt"
".att_syntax prefix nt"
: : "a" (out), "b" (in), "c"(count), "d"(rest): "xmm0","xmm1");


// scalar part; 1 float per loop iteration
if (rest!=0)

__asm __volatile__ (".intel_syntax noprefixnt"
"add eax,ecx nt"
"add ebx,ecx nt"

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

return;



参阅


  • 并行计算

Popular posts from this blog

The Dalles, Oregon

眉山市

清晰法令