高階通用程式語言Julia官方宣布,在1.3.0 Alpha測試版開始加入多執行緒任務平行(Task Parallelism)功能,這仍是1.3.0的早期預覽版本,正式版預計將會在數個月後推出。

隨著軟體效能提升,越來越仰賴在多個處理器核心同時執行工作,官方過去為Julia添加了多程序、分散式程式開發和GPU運算功能,官方提到,他們受到英特爾TBB(Threading Building Blocks)和Go的啟發,現在再次增加了多執行緒,為Julia程式加入全新的執行緒介面。

任務平行化模型可以允許多個程式平行執行,而任務將在可用的執行緒上同時執行所有的程式碼,官方提到,這個平行化功能運作的方式,類似垃圾回收模型,開發者可以自由地分配物件,而不需要擔心這些物件在什麼時候應該被釋放,而任務平行化則讓開發者可以自由地發布數百萬個任務,而不需要擔心任務在哪個執行緒上執行。

Julia採用的這個模型是可移植的,而且沒有低階細節,開發者不需要主動啟動和停止執行緒,甚至不需要關心系統有多少處理器和執行緒。除此之外,這個平行模型可支援使用巢狀結構,並且是可組合的,開發者可以呼叫函式庫的平行任務,而這些任務還可以啟動自己的平行任務。

透過多執行緒工作平行化功能,Julia程式可以排程許多呼叫函式庫函式的平行任務,官方提到,這是高階語言很重要的功能,因為在高階語言程式需要經常呼叫函式,而Julia增加了平行運算的能力,同時也就為整個Julia套件生態系增加了多核平行運算的能力。

目前這個多執行緒任務平行化功能仍有許多限制,官方提到,在實作上,每一個任務都需要有自己的執行堆疊,但這與一般Unix作業系統提供的程序與執行緒堆疊不同,因此Julia自己實作了一個替代切換堆疊,不過,這是需要在任務切換時,以時間來交換記憶體空間的折衷做法。

另外,任務現在也無法在不同執行緒中搬遷,官方提到,這在未來的版本會修正。而且為了避免CPU的使用率總是維持100%,因此系統會讓部分任務睡眠,但當一些執行緒在其他執行緒繼續睡眠的時候排程新工作,則會產生同步上的問題。

官方提到,多執行緒任務平行功能的發展,從Julia 0.1就開始,他們提供了對稱式協作程式功能,並將其應用於事件I/O上,因此Julia程式中總會有一個並行單元運作,在2014年,官方明確的認為Julia需要基於執行緒的平行化功能,在開發垃圾收集器以及執行緒本地儲存功能時,奠定了一些基礎。

在2016年Julia 0.5版本提供了巨集執行緒(Threads for Macro)功能,可以讓開發者在所有核心中,簡單地處理平行迴圈,但這個多執行緒有著巨大的限制,與任務和I/O系統不相容,開發者無法在執行緒迴圈中,進行任何I/O或是在任務間切換。2016年之後官方投入更多的人力,在平行化這項功能的開發,最後花了約兩年的時間,現在得以在Julia中開始真正提供多執行緒能力。


Advertisement

更多 iThome相關內容