簡介
這與一次只能處理一個數據的
標量處理器正相反。向量處理器可以在特定工作環境中極大地提升性能,尤其是在數值模擬或者相似領域。向量處理器最早出現於20世紀70年代早期,並在70年代到90年代期間成為
超級計算機設計的主導方向,尤其是多個克雷(Cray)平台。由於90年代末常規處理器設計性能提升,而價格快速下降,基於向量處理器的超級計算機逐漸讓出了主導地位。
其他CPU設計還可能包括多重指令處理多重(向量化的)數據集的技術——也就是所謂的MIMD(多重指令、多重數據)——並實現了VLIM。此類設計通常用於特定套用場合,而不是面向通用計算機的市場化產品。在
富士通的 FR-V VLIW/vector 處理器中,組合使用了兩種技術。
基本特點
平行向量處理機最大的特點是系統中的CPU是專門定製的
向量處理器(VP)。系統還提供共享存儲器以及與VP相連的高速交叉開關。
來自現實世界的例子
x86 架構中的向量指令套用: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;}
並行計算
並行計算(英語:
parallel computing)一般是指許多指令得以同時進行的計算模式。在同時進行的前提下,可以將計算的過程分解成小部分,之後以
並發方式來加以解決。
電腦軟體可以被分成數個運算步驟來運行。為了解決某個特定問題,軟體採用某個算法,以一連串指令運行來完成。傳統上,這些指令都被送至單一的
中央處理器,以循序方式運行完成。在這種處理方式下,單一時間中,只有單一指令被運行(processor level: 比較微處理器,CISC, 和RISC,即流水線Pipeline的概念,以及後來在Pipeline基礎上以提高指令處理效率為目的的硬體及軟體發展,比如branch-prediction, 比如forwarding,比如在每個運算單元前的指令堆疊,彙編程式設計師對programm code的順序改寫)。並行運算採用了多個運算單元,同時運行,以解決問題。