簡介
流計算模型,是一種將一般套用轉化為以流為基本處理對象的流套用的計算模型,其基本思想是把套用組織成流(stream)和計算核心(kernel)兩級。從巨觀角度看,流計算模型中被處理的基本數據單位是流,各個操作被視為對整條流的操作。在流計算模型中,對整條流的巨觀操作包括流聚合(stream gather),流分散(stream scatter)和流計算,其中流計算是以計算核心(kernel)的形式體現的。 流計算模型摒棄了傳統計算模型中計算和訪存的緊密耦合形式,將套用中的計算和訪存進行解耦合,它對一般套用的轉化過程在計算和數據組織兩個方面展開。在計算方面,流計算模型把套用分解為多個對流進行處理的計算核心,這些計算核心通過流連結起來共同完成整個套用的複雜功能。在數據組織方面,流計算模型通過 stream gather 操作將套用中需要被處理的數據組織成流,流進入計算核心,流中的元素在計算核心內部被處理後形成新的輸出流。如此反覆,流在計算核心之間不斷傳遞,不斷被計算核心處理,最終完成套用的功能,通過 stream scatter操作將輸出流轉化為套用的輸出數據 。
流數據
流數據,在通信領域中它常用來表示一連串的數字編碼序列,但是,在實際套用中它用來表示某一設備所產生的連續事件信息。也可以看成是一組組離散事件集合體,由成千上萬個數據源,源源不斷的持續生成,生成的數據流以非傳統意義上的系統日誌方式傳送。它代表了一種新的數據模式,與傳統資料庫模型不同,它是一種大量、連續、快速、隨時間變化的數據流。這類事件流包含兩個方面的特徵:一是事件信息是連續不斷的產生,在早期,這類數據一般在股票交易系統中出現的比較多,但是銀行、網際網路監控等領域也會產生大量持續的數據;二是需要實時的對更新的數據流進行分析(如趨勢分析、預測)等,提取有用的信息 。
流計算是一種編程計算機編程範式。1966年美國計算機專家B.薩瑟蘭(Bert Sutherland)在其博士論文中提出數據流編程框架。這是流計算的雛形。流計算利用並行處理程式可以同時處理多個套用,實現單指令多數據的工作,無需考慮計算單元間的分配、同步和通信問題。流計算通過限制並行計算,簡化了軟體和硬體的並行工作。對一組數據(流)中的每個元素,都有一系列的指令(核函式)進行套用操作。流計算是針對流數據的實時計算,合了大數據處理的高效性與實時性。其主要套用的場景是,流數據量較大且連續並且實時性要求較高。
流級程式
基於流計算模型,應用程式向流程式的映射也自然地採用流和計算核心兩級編程模式。流級程式與普通程式的框架不同,在數據類型和操作類型兩個方面進行了擴展,並且在結構上有特殊要求。在數據類型方面的主要擴展就是增加了新的數據類型—流。根據前面對流概念的討論,流級程式將一個數據佇列定義為一條流。流這個新增的數據類型也相應地引起了流級程式中操作類型方面的擴展,即對流的操作。前面已經提到對流的操作主要包括三種,分別是流聚合 stream gather、流分散stream scatter 和流計算 kernel。流聚合負責從程式的各類數據結構中取數據,然後形成一條流。例如,可以將一個二維整型數組中的數組元素按照列順序排列而形成一條流,也可以按照一定的規則從一個檔案中讀取數據來形成一條流。流分散與流聚合的過程相反,負責將流中的數據按照一定規則存入各類數據結構。在流聚合和流分散過程實際完成的是流與其他數據結構的轉化,轉化過程遵循一定的規則。流級程式的一般模式是通過流聚合組織輸入流,然後調用計算核心對流進行處理,生成輸出流,該輸出流可能繼續作為下一個計算核心的輸入而被使用,如此反覆直到全部計算核心執行完畢,生成最終的輸出流,然後通過流分散將輸出流的數據保存到普通的數據結構中去。 計算核心程式在流處理核心上執行,負責對流中元素的計算。計算核心程式與普通的函式類似,但是其參數包含流。另外,計算核心是為了並行處理而設計的,因此必須明確它是在多個並行處理單元上同時執行的。不過,大多數情況下這種並行化不是自動的,程式設計者必須自己為並行處理單元設計流數據的移動。
並行級別
流體系結構是與流計算模型完全匹配的,因此流體系結構能夠充分開發套用中的多級並行性和局域性。對並行性的開發包括 ILP、DLP 和 TLP 三種,局域性的開發主要指生產者-消費者局域性。
指令級並行(Instruction Level Parallelism, ILP):運算簇內部多個ALU 單元的結構確保能夠以 VLIW 打包的形式開發指令級並行。
數據級並行(Data Level Parallelism, DLP):通過共用同一個微控制器,計算核心程式以 SIMD 的方式在多個結構相同的運算簇上並行執行。
任務級並行(Task Level Parallelism, TLP):在流訪存和 kernel 運行之間存在任務級並行,例如前一個 kernel 運行時,後一個 kernel 的流可以同時載入。另外,多個流處理器可以通過網路互聯,並行執行不同 kernel,形成 kernel 間的任務級並行。
生產者-消費者局域性(Producer-consumer Locality):對生產者-消費者局域性的有效開發得益於流體系結構中軟體管理的片上存儲層次。流調度器軟體控制前一個 kernel 生成的中間流不向片外存回,而是只需要保存在片上存儲中,後一個 kernel 以片上存儲的中間流作為輸入流即可。對生產者-消費者局域性的開發通過減少了片外訪存的方式有效提高流計算性能。