亚洲av成人精品日韩一区,97久久久精品综合88久久,玩弄japan白嫩少妇hd,亚洲av片不卡无码久久,玩弄人妻少妇500系列

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Go語言在多線程領域編程、跨異構平臺及編程難易程度的優(yōu)勢

SwM2_ChinaAET ? 來源:未知 ? 作者:李倩 ? 2018-08-14 09:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

摘要:代表信息新時代的Go語言誕生了,它所具有的高并發(fā)性非常適合服務器編程,而其天生的跨平臺優(yōu)勢,降低了分布式異構計算平臺的開發(fā)難度,最終讓程序變得簡潔、干凈、高效。對Go語言在國產平臺上的移植進行探索,實測Go語言在龍芯和飛騰兩個國產平臺的多核調用功能,分析研判結果,得出結論,為未來Go語言在國產平臺的發(fā)展提供參考。

0 引言

CPU是電子產品的核心,代表著信息產業(yè)的發(fā)展水平。CPU發(fā)展至今已經(jīng)有四十多年的歷史了,實際就是Intel公司的發(fā)展歷史[1]。Intel的CPU和其兼容產品占領了PC的大半江山。我國CPU戰(zhàn)略已經(jīng)發(fā)展十余年,部分領域完全具有核心技術,產業(yè)化取得積極進展,但是與國際主流廠商Intel等仍存在較大差距。國產CPU由于受多方因素制約,單核性能并不高,在2000年左右所有的微處理器廠商都轉向了多核微處理器的開發(fā)。為提升CPU性能,國產CPU均為多核設計。目前,部分產品雖然在黨政軍部門及重要的信息系統(tǒng)有所應用,但是由于產業(yè)生態(tài)還未建立,所應用的場景還比較簡單,可用于開發(fā)應用的編程語言也較為單一。國產CPU的發(fā)展事關我國信息產業(yè)的核心競爭力和可持續(xù)發(fā)展力。為了充分發(fā)揮國產CPU的性能,需要通過并行編程來解決。

Go語言設計目標之一就是多核編程,不使用多線程編程模型,通過基于CSP的communication通道并發(fā)編程,使得并發(fā)編程更加簡便。Go語言原生支持廣泛應用的X86、X64指令集,而且支持龍芯的MIPS64及飛騰的ARM64指令集。這使得Go語言程序在跨平臺移植上天生具有優(yōu)勢。Go語言的其他一些特性使得其在國產CPU平臺應用具有非常廣泛的前景。

1 Go語言簡介

Go語言是2009年11月Google正式宣布推出的一種編程語言。它的并發(fā)機制使得編寫能夠充分利用多核和網(wǎng)絡通信的程序變得非常容易。Go語言是靜態(tài)類型的語言,它的類型系統(tǒng)沒有層級,完全垃圾回收,比典型的面向對象語言更輕量級;Go語言是一種編譯型語言,它結合了解釋型語言的游刃有余,動態(tài)類型語言的開發(fā)效率,以及靜態(tài)類型的安全性。

Go編譯器支持包括:x86、x64、ARM、arm64、ppc64、ppc64le、mips、mipsle、mips64、mips64le、s390x多種不同的CPU指令集。可以支持包括FreeBSD、Linux、Solaris和Windows等的多種操作系統(tǒng)。Go語言是跨平臺、跨操作系統(tǒng)的語言,部署非常簡單。Go 編譯生成的是一個靜態(tài)可執(zhí)行文件,除了glibc外沒有其他外部依賴。Go的并發(fā)性好,而且goroutine 和 channel 使得編寫高并發(fā)的服務端軟件變得相當容易,非常適合用來服務器編程。目前Go語言已經(jīng)成功的項目包括目前比較流行的云框架Docker、NSQ等分布式框架等。

2 國產CPU平臺簡介及應用現(xiàn)狀

目前,我國自主研發(fā)的處理器芯片主要包括龍芯(MIPS64指令集)、申威(Alpha指令集)、飛騰(ARM64指令集)及兆芯(X86指令集)4類。商用領域基于龍芯3B1500 CPU、飛騰FA1500A CPU生產的商用服務器占據(jù)國產服務器主流位置,龍芯、飛騰服務器分別搭載中標麒麟及銀河麒麟操作系統(tǒng)。

在商用領域,全國產化平臺剛剛起步,配套的商用軟件較少,沒有建立起完整的產業(yè)生態(tài),同時又受到處理器自身性能的影響,基于上述兩款主流處理器平臺的服務器,主要還是用于對系統(tǒng)訪問并發(fā)及響應時間要求不高的Web網(wǎng)站類網(wǎng)絡應用服務。國產處理器應用服務的開發(fā)還是以Java語言為主,搭配開源JBoss、Ttomcat或國產中間件,數(shù)據(jù)庫采用國產數(shù)據(jù)庫或MySQL等開源數(shù)據(jù)庫。

3 Go語言在國產平臺的優(yōu)勢

3.1 國產平臺現(xiàn)有的編程語言匱乏

目前,基于國產CPU的國產化平臺比較成熟的僅有C、C++編譯器。廠商對Java虛擬機在國產平臺上進行編譯、適配及優(yōu)化。由于Java應用運行過程中依賴的大量Java第三方框架都是源于X86構架體系,并未針對國產CPU進行優(yōu)化,一些應用在大壓力或大并發(fā)等某些場景下會出現(xiàn)假死、宕機等情況,嚴重影響應用的正常運行。雖然國產平臺也支持其他編程語言如Python、PHP等,但這類腳本語言的解釋器也是交叉編譯獲得的,并非自身支持,在進行跨平臺交叉編譯過程中會遇到各種問題,很多問題需要軟件開發(fā)人員修改軟件源代碼,未經(jīng)過大量適配驗證,很難保證其開發(fā)的應用的穩(wěn)定性。

3.2 Go語言的跨平臺及并發(fā)優(yōu)勢

Go語言原生支持龍芯CPU的MIPS64le指令集和飛騰CPU的ARM64指令集,天生具有跨平臺優(yōu)勢。Go開發(fā)應用在任意平臺開發(fā)完成后,直接編譯,編譯后的二進制文件在同類平臺可直接拷貝運行,無需再次重新編譯。除了glibc外,無需其他外部依賴。可以直接在該開發(fā)平臺的任意計算機上運行,無需像Java運行那樣需要虛擬機,需要配置復雜的環(huán)境變量;在作為網(wǎng)絡服務時更不需要像Tomcat、Apache等的Web中間件。

Go語言的異構平臺移植也非常簡單,僅需要應用程序的源碼,在異構平臺上直接編譯即可,且編譯后的二進制文件在同類平臺可直接拷貝運行。Go語言本身就具有天生的跨平臺優(yōu)勢,大大降低了分布式異構計算平臺的開發(fā)難度,非常適合在目前多構架的國產化平臺上作為開發(fā)語言。

Go語言在并發(fā)方面,goroutine和channel機制提供了輕量級并發(fā)機制;在性能方面,與Java的性能不分上下,而內存資源消耗方面,相對Java和其他動態(tài)語言,具備明顯的優(yōu)勢。在網(wǎng)絡和HTTP應用方面,Go語言有良好的標準庫和生態(tài)系統(tǒng)支持,而在標準庫方面,已提供了處理多種網(wǎng)絡所需的輕量級的代碼庫,對網(wǎng)絡的核心協(xié)議HTTP的高并發(fā)支持,完全可以撼動Java。國產處理器由于指令集及工藝等多方面原因,導致單核計算性能不高,為提高整體計算能力均采用多核技術。如:龍芯3B1500為8核,商用服務器為雙路16核(2顆3B1500),飛騰FT1500A服務器為16核。因此,充分利用多核計算能力或搭建基于國產處理器的云計算平臺是目前國產化平臺的提高整體性能發(fā)展的方向。

4 Go語言在國產環(huán)境下的移植

以飛騰平臺為例,飛騰CPU采用ARM64構架。首先在X86平臺上交叉編譯出面向ARM64平臺的Go語言自舉編譯工具,利用$GOOS=linux GOARCH=arm64./bootstrap.bash 編譯命令編譯出可在ARM64平臺運行的Go語言自舉編譯工具,然后利用該自舉編譯工具在ARM64平臺編譯安裝Go源碼。安裝完成后,Go語言會自動進行自身測試。測試完成后提示ALL TESTS PASSED,添加GOROOT至系統(tǒng)環(huán)境變量。Go語言的移植完成。龍芯平臺移植過程與飛騰平臺移植過程不同之處是在編譯自舉工具時GOARCH參數(shù)設置為MIPS64le。

5 Go語言的多核工作原理簡介

Go語言可以快速高效地調用多核進行計算,其優(yōu)勢源于Go語言的Go runtime的調度器[2]。

用戶空間線程和內核空間線程之間的映射關系有N:1、1:1和M:N 3種通常的線程模型。其中N:1模型是幾個用戶空間線程在一個OS線程上運行。該模型上下文切換非??焖?,但不能利用多核系統(tǒng)的優(yōu)點。1:1模型一個執(zhí)行線程匹配一個OS線程。 它利用機器上的所有內核,但上下文切換速度較慢,因為它必須通過操作系統(tǒng)進行。

Go通過使用M:N調度程序來取得上述兩種方式的最佳效果。它將任意數(shù)量的goroutine調度到任意數(shù)量的OS線程上。開發(fā)者可以獲得快速上下文切換,并利用系統(tǒng)中的所有內核。這種方法的主要缺點是增加了調度器的復雜性。

為了完成調度任務,Go Scheduler使用3個主要實體,如圖1所示。

M三角形表示OS線程。這是由操作系統(tǒng)管理的執(zhí)行線程,其工作原理與標準POSIX線程相似。

G圓圈代表一個goroutine。它包括堆棧、指令指針和其他重要的調度goroutines的信息,像任何可能被阻止的channel等。

P是從N:1調度程序進入M:N調度程序的重要部分,表示調度的上下文??梢詫⑵湟暈樵趩蝹€線程上運行Go代碼的調度程序,一個局部的調度器。

如圖2所示,有2個線程(M),每個線程都有一個上下文(P),每個線程都運行一個goroutine(G)。為了運行goroutines,線程必須持有一個上下文。

P的數(shù)量可以通過GOMAXPROCS()來設置,代表了真正的并發(fā)度,即有多少個goroutine可以同時運行??梢允褂盟鼇碚{整Go進程到計算機的調用,例如在4核心PC上運行4個線程的Go代碼。

白色的goroutines沒有運行,處于就緒狀態(tài),正在等待被調度。P維護著這個隊列。在Go語言里,每當goroutine執(zhí)行go語句時,goroutines都會添加到隊列的末尾。一旦上下文運行了一個goroutine直到調度點,它會從其運行隊列中彈出一個goroutine,設置堆棧和指令指針,并開始運行goroutine。

圖3中當一個OS線程被阻塞時,P可以轉而投奔另一個系統(tǒng)線程。從圖中看到,當一個線程M0陷入阻塞時,P轉而在OS線程M1上運行。調度器保證有足夠的線程來運行所有P。

M1可能是被創(chuàng)建,或者從線程緩存中取出。當syscall返回時,它必須嘗試獲取一個上下文來運行返回的goroutine,一般情況下,它會從其他的系統(tǒng)線程取得一個上下文,如果沒有獲取到,它就把goroutine放在一個全局隊列中,放入線程緩存里。上下文會周期性地檢查全局隊列,否則全局隊列上的goroutine永遠無法執(zhí)行。

如果上下文的運行隊列的工作量不平衡,如圖4所示,則可能會發(fā)生這種情況。P所分配的任務G很快就執(zhí)行完了(分配不均),這就導致了一個上下文P空閑而系統(tǒng)忙碌。當一個上下文用完時,它將嘗試從另一個上下文中竊取大約一半的運行隊列。這確保在每個上下文上總是有工作要做,這反過來確保所有線程都以最大容量工作,每個系統(tǒng)線程都能充分地使用。

6 實測Go語言在國產平臺的多核調用

6.1 并行積分計算原理

并行計算積分。計算積分是一個用來展示并發(fā)編程和它本身加速度(表示的是多處理器執(zhí)行時間和單處理器執(zhí)行時間的比值)的常見例子,例如一個函數(shù)f(x)在[a,b]上的積分:

通過循環(huán)觸發(fā)goroutine(協(xié)程)來實現(xiàn)np個子算組的并行運算,通過Go代碼來計算Pi的積分:

6.2 Go語言并行計算核心代碼實現(xiàn)

核心代碼:

上述計算中,一個計算組是通過 block(start,end int,c chan float64)這個函數(shù)實現(xiàn)的,這個函數(shù)計算從start到end之間的矩形面積、通道(channl)c則是用來在結束的時候進行同步,并且把計算組的結果送到主線程。主線程通過調用rutime.GOMAXPROCS(np)建立運行時所使用的CPU核數(shù),np為使用CPU的個數(shù),然后通過make構造一個有np大小緩存的通道,進行阻塞,確保計算并行進行。最后把執(zhí)行np次的結果進行累加以獲得pi的結果。

6.3 Go語言并行計算在國產CPU多核調用測試

6.3.1 測試環(huán)境

飛騰平臺:FT1500A16核×1;內存16 GB;Go編譯器1.8.1;操作系統(tǒng):銀河麒麟4.0。

龍芯平臺:3B1500A8核×2;內存16 GB;Go編譯器1.8.1;操作系統(tǒng):中標麒麟6.0。

6.3.2 測試方法

程序內計時,每次測試3次,取最短時間。結果如圖5、圖6所示。

上面兩組數(shù)據(jù)圖展示了,在龍芯3B1500處理器和飛騰FT1500A上,并行Go計算Pi的效率,對于小的問題規(guī)模(n=105,106),使用多核不能增加的執(zhí)行時間,這是因為過多的進程調度和初始化協(xié)程導致的,大部分時間沒有執(zhí)行并行計算。當問題規(guī)模n變大的時候(n=108,109,1010),使用多處理器能夠顯著地縮短計算所需的執(zhí)行時間。

6.3.3 結果對比

結果對比如圖7所示。

從圖7可以看出,與其他公開的測試的數(shù)據(jù)基本一致,飛騰FT1500A無論單核和多核性能均比龍芯3B1500CPU計算能力快出近一倍。

6.4 Go語言在調用多核進行并行計算的性能線性特性

為了能夠體現(xiàn)并發(fā)執(zhí)行的加速度,以飛騰F1500A為例子以通過式(6)計算速度:

在這里Tnp和TMaxnp是處理器當前使用核數(shù)計算所用時間和處理器最大核數(shù)計算所用時間。結果如圖8所示。

在圖8中,當問題規(guī)模非常大的時候,增長幾乎就是線性的了,特別是問題規(guī)模達到(n=109)的時候,幾乎和擬合趨勢線重合。

7 結束語

本文對Go語言在多線程領域編程、跨異構平臺及編程難易程度的優(yōu)勢進行了闡述;對目前我國國產CPU在商業(yè)化應用領域現(xiàn)狀進行了分析。使用Go語言在主流兩款國產平臺對多核調用進行測試。同時,對Go語言的多核工作原理進行了簡要分析。綜上所述,Go語言非常適合作為除Java外的另一種國產CPU平臺應用開發(fā)語言,有較為廣泛的應用前景。本文對未來Go語言在國產CPU平臺上的開發(fā)及應用提供了一定的參考價值。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11077

    瀏覽量

    217032
  • 編程語言
    +關注

    關注

    10

    文章

    1956

    瀏覽量

    36637
  • go語言
    +關注

    關注

    1

    文章

    159

    瀏覽量

    9370

原文標題:【學術論文】Go語言在國產CPU平臺上應用前景的探索與思考

文章出處:【微信號:ChinaAET,微信公眾號:電子技術應用ChinaAET】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Rust的多線程編程概念和使用方法

    和字段、常見用法以及多線程的一些實踐經(jīng)驗。由淺入深帶你零基礎玩轉Rust的多線程編程。 線程的基本概念和使用方法 Thread是Rust中并發(fā)編程
    的頭像 發(fā)表于 09-20 11:15 ?1406次閱讀

    labview多線程編程

    子曰:何為labview多線程編程?
    發(fā)表于 03-11 15:46

    C++ 面向對象多線程編程下載

    C++ 面向對象多線程編程下載
    發(fā)表于 04-08 02:14 ?70次下載

    C++面向對象多線程編程 (pdf電子版)

    C++面向對象多線程編程共分13章,全面講解構建多線程架構與增量多線程編程技術。第1章介紹了
    發(fā)表于 09-25 09:39 ?0次下載

    QNX環(huán)境下多線程編程

    介紹了QNX 實時操作系統(tǒng)和多線程編程技術,包括線程間同步的方法、多線程程序的分析步驟、線程基本程序結構以及實用編譯方法。QNX 是由加拿大
    發(fā)表于 08-12 17:37 ?30次下載

    linux多線程編程課件

    電子發(fā)燒友為您提供了linux多線程編程課件,希望對您學習 linux 有所幫助。部分內容如下: *1、多線程模型單處理器模型和多處理器系統(tǒng)上,都能改善響應時間和吞吐量。 *2、
    發(fā)表于 07-10 11:58 ?0次下載

    linux多線程編程開發(fā)

    本文中我們針對 Linux 上多線程編程的主要特性總結出 5 條經(jīng)驗,用以改善 Linux 多線程編程的習慣和避免其中的開發(fā)陷阱。本文中,
    發(fā)表于 12-26 14:24 ?55次下載
    linux<b class='flag-5'>多線程</b><b class='flag-5'>編程</b>開發(fā)

    MFC下的多線程編程

    計算機上的上位機制作工具語言之MFC下的多線程編程
    發(fā)表于 09-01 14:55 ?0次下載

    VC-MFC多線程編程詳解

    VC編程中關于 MFC多線程編程的詳解文檔
    發(fā)表于 09-01 15:01 ?0次下載

    Windows多線程編程入門講解

    計算機上的上位機制作工具語言之Windows多線程編程入門講解,感興趣的可以看看。
    發(fā)表于 09-01 15:27 ?0次下載

    Windows多線程編程

    計算機上的上位機制作工具語言之Windows多線程編程,感興趣的可以看看。
    發(fā)表于 09-01 15:27 ?0次下載

    什么是多線程編程?多線程編程基礎知識

    摘要:多線程編程是現(xiàn)代軟件技術中很重要的一個環(huán)節(jié)。要弄懂多線程,這就要牽涉到多進程。本文主要以多線程編程以及
    發(fā)表于 12-08 16:30 ?1.3w次閱讀

    多線程編程指南的PDF電子書免費下載

    多線程編程指南》介紹了 SolarisTM 操作系統(tǒng) (Solaris Operating System, Solaris OS)中 POSIX?線程和 Solaris 線程
    發(fā)表于 06-11 08:00 ?4次下載
    <b class='flag-5'>多線程</b><b class='flag-5'>編程</b>指南的PDF電子書免費下載

    mfc多線程編程實例

    (圖形用戶界面)應用程序的開發(fā)。在這篇文章中,我們將重點介紹MFC中的多線程編程多線程編程軟件開發(fā)中非常重要,它可以實現(xiàn)程序的并發(fā)執(zhí)行
    的頭像 發(fā)表于 12-01 14:29 ?1941次閱讀

    socket 多線程編程實現(xiàn)方法

    現(xiàn)代網(wǎng)絡編程中,多線程技術被廣泛應用于提高服務器的并發(fā)處理能力。Socket編程是網(wǎng)絡通信的基礎,而將多線程技術應用于Socket
    的頭像 發(fā)表于 11-12 14:16 ?1007次閱讀