上個月的 Build 2024 開發者大會,除了滿滿的 AI 與 Copilot,另一大焦點莫過於見證 Arm 處理器在首波 AI PC 新機潮站上浪尖。

聯想、惠普、戴爾、華碩、宏碁及三星等一線 PC 品牌,預計 6 月開始出貨支援微軟 Copilot+ PC 標準的 AI PC,用的不是 Intel / AMD CPU,而是高通的 Snapdragon X Elite 處理器。

從 1980 年代起,Windows 作業系統 + Intel CPU 的「Wintel」組合已稱霸 PC 界超過 40 年。但近年來 ARM 架構處理器被普遍應用在智慧手機、蘋果系列,靠著低功耗 + 高效能大放異彩。微軟在 2016 年發佈 Winodws on Arm (WOA),開始讓 Windows 也支援 Arm 處理器,但一開始的 Surface RT、Windows Phone 仍至於 Surface Pro X 都不算成功。直到首波 AI PC 清一色被 Arm 拿下,遲鈍如我,也知道該好好認識一下 Arm64 Windows 惹。(延伸閱讀:AI PC點火CPU戰場,高通Arm架構狂搶英特爾生意!by 數位時代)

等等,我連設備都沒有,要試個毛?

不慌,Azure 支援 Arm VM,可建立採用 Ampere Altra Arm 處理器的虛擬機,照著教學文件花幾分鐘便建好一台跑 Windows 11 Pro 的 Arm 主機。

我把 Arm VM 當成一般的 x64 Windows 亂測,照著新裝機 Chocolatey 安裝清單裝好常用工具,其中 Notepad++、7-Zip、Git、VSCode 均可直接用 Chocolatey 裝好及使用;Chrome 需改用瀏覽器去下載 Win11 Arm 版,也能順利過關;只有 Cmder 可能用了某些 Hacking 手法而不相容。

Arm64 Windows 對 x64/x86 程式的相容性比我想像好,查了一下,原來 Windows on Arm 會自動改用模擬器(Emulator)跑 x64/x86 程式,而 Windows 11 24H2 新推出名為 Prism 的新版模擬器,號稱可進一步提升執行效能及降低 CPU 使用率。

模擬器會即時將 x86 指令區塊編譯為 Arm64 指令,並有服務快取編譯結果以便與其他應用程式共用。模擬器只支援 User Mode 不支援 Kernel Mode,故核心元件或驅動程式必須乖乖編譯成 Arm64 版本。而既然是模擬器,效能一定不如原生版本,故若條件允許,應用程式另外提供 Arm64 版本,還是較好的做法。

如下圖,從工作管理員程序的架構欄可看出程式是原生 Arm64 還是用模擬器跑 x64/x86 模式:

至於要開發 Arm64 專用版應用程式,最方便的選擇是 .NET 6+ 是 .NET 4.8.1,開發方式不變,編譯時改建置成 win-arm64 平台就好。其他語言的話,有 clang-cl、Qt for Windows, Boost C++ Library、Bazel、Linaro... 等,完整資訊可參考官方文件

最後,我準備小試一下,比較用 x64 模擬器跟編譯成原生 Arm64 版,效能差多少?

原本請 ChatGPT 寫了一段 BenchmarkDotNet 跑排序的 C# 效能測試程式,但編譯成 win-x64 會遇到奇怪的錯誤無法執行:

// * Warnings *
Environment
  Summary -> Detected error exit code from one of the benchmarks. It might be caused by following antivirus software:
        - Windows Defender (windowsdefender://)
Use InProcessEmitToolchain or InProcessNoEmitToolchain to avoid new process creation.

  Summary -> Benchmark was executed on the virtual machine with Hyper-V hypervisor. Virtualization can affect the measurement result.

不想失焦跑去射茶包,決定改用 Stopwatch 簡單測試就好,程式如下:

using System;
using System.Diagnostics;

public class BenchmarkDemo
{
    const int N = 1000;
    static int[] data;

    static void Setup()
    {
        data = new int[N];
        var random = new Random();
        for (int i = 0; i < N; i++)
        {
            data[i] = random.Next(0, N);
        }
    }

    static void BubbleSort()
    {
        var array = (int[])data.Clone();
        for (int i = 0; i < array.Length - 1; i++)
        {
            for (int j = 0; j < array.Length - i - 1; j++)
            {
                if (array[j] > array[j + 1])
                {
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
        }
    }

    static void ArraySort()
    {
        var array = (int[])data.Clone();
        Array.Sort(array);
    }

    public static void Main(string[] args)
    {
        Setup();
        int times = 10000;
        var sw = new Stopwatch();
        sw.Start();
        for (var i = 0; i < times; i++) BubbleSort();
        sw.Stop();
        Console.WriteLine($"BubbleSort: {sw.ElapsedMilliseconds:n0}ms");
        sw.Restart();
        for (var i = 0; i < times; i++) ArraySort();
        sw.Stop();
        Console.WriteLine($"ArraySort: {sw.ElapsedMilliseconds:n0}ms");        
    }
}

使用 dotnet publish -r win-x64 --no-self-containeddotnet publish -r win-arm64 --no-self-contained 編譯成 x64 版跟 arm64 版,猜猜兩個速度差多少?

14s vs 8.6s,從 win-x64 改成 win-arm64,速度提升大約 40%。

結論是,如果程式要部署到 Arm64 Windows 執行,投資時間改編譯成 win-arm64 是值得的。

At Build 2024, aside from AI and Copilot, a major focus was ARM CPUs in AI PCs with Snapdragon X Elite processors. The dominance of the “Wintel” combination is challenged by ARM processors, now supported by Windows on ARM. Azure offers ARM VMs for testing. ARM64 Windows shows good compatibility via emulation but native ARM64 apps offer better performance, as demonstrated by a 40% speed increase in a benchmark test.


Comments

# by Joker

差四成多哇塞,看來可以做的領域多囉。

# by Anonymous

請問一下瀏覽器是什麼? 之前試玩過樹莓派的 Windows 內建還是沒有 Chromium 化過的 Edge

# by yoyo

Notepad++, 7-Zip, VSCode都有ARM64版 Chocolatey會依CPU架構自動選擇嗎?

# by Jeffrey

to Anonymous,Win11 Arm64 上 Edge/Chrome 都可以用。

# by Jeffrey

to yoyo,目前的 Chocolatey 看來還沒進化到可依 CPU 架構安裝不同版本。

# by 失敗的人

arm64 win 可以安裝 sqlserver 嗎?我都裝不起來…哭

# by Windows

sqlserver目前只支援x64 cpu https://learn.microsoft.com/en-us/sql/sql-server/install/hardware-and-software-requirements-for-installing-sql-server-2019?view=sql-server-ver15#pmosr

Post a comment