官方今日釋出Rust 1.27更新,其中包括了社群期盼已久的功能,首先是單指令流多資料流(Single Instruction Multiple Data,SIMD)現在基本可用,另一個則是#[must_use]屬性獲得升級,已經進入函式的行列。套件管理器Cargo也有小更新,現在會嘗試探索使用者專案的測試、範例以及二元檔。

有了SIMD加持,Rust將能加速運算。官方舉例,假設存在兩個Slice a和b並進行數字相加,再將結果放置在第3個Slice c中。最基本的方法就是走訪每組元素,將他們相加後儲存為結果。但其實編譯器可以做的更好,像是LLVM就經常會進行自動向量化(Automatic vectorization),分析程式碼中的迴圈,並且嘗試在電腦上使用向量暫存器和指令,執行這些迴圈。這個動作可以加速程式碼執行效率,而這也是SIMD帶來的優點。

假設Slice a和b都是16個元素長,而每個元素都是u8,也就是說每個Slice都是128位元組的資料,使用SIMD,開發者可以把待相加的兩個Slice放進128位元組暫存器中,並使用單一指令把他們相加在一起,再把結果複製到第三個Slice c中。

雖然Rust本來就具備自動向量化,但官方表示,編譯器無法在所有情況都完美發揮這個功能,而且也不是所有CPU都支援,因此LLVM也可能不會使用自動向量化,以確保開發者的程式能在廣泛的硬體中執行。而在Rust 1.27中,官方直接開放這類指令,增加std :: arch模組讓開發者能夠直接控制,而不需要依賴智慧編譯器的判斷。

而這個函式具有兩個版本,其中一個是特殊類型的SIMD功能AVX2,可以供開發者進行256位元的操作,is_x86_feature_detected巨集能讓開發者偵測電腦的CPU是否支援AVX2,是則呼叫foo_avx2函數,否則退回non-AVX的實作,這樣讓支援AVX2的系統能夠快速的執行程式,但即便系統不支援也沒關係,照樣也能正常執行程式。官方提到std :: arch語法很低階,他們希望未來可以提供更高階的std :: simd模組,但開發者可以先適應這個功能。

在Rust 1.27中,#[must_use]屬性被升級為函式,過去他只適用於諸如Result <T,E>的類型。另外,Cargo也有兩個小更新,Cargo現在接受-target-dir標籤,用來改變給定調用的目標目錄。還有Cargo現在會嘗試自動探索專案中的測試、範例和二進位檔案,雖然有時候需要明確的配置,但多數時可以自動運行的很好。

官方提到,在1.27.0發布前夕,他們發現在1.26.0中加入的預設匹配綁定功能,可能造成系統不穩定的錯誤,但由於發現的時間太晚,並且從1.26就存在了,因此官方還是維持版本發布節奏,照原定計畫釋出1.27.0版本,但很快的,就會釋出1.27.1來修正這個臭蟲,需要的話還會有1.27.3,開發者可以隨時注意接下來版本發布的訊息。


Advertisement

更多 iThome相關內容