Yerel CPU platformlarında Go dilinin uygulama olasılıklarını keşfetme ve düşünme

0 Önsöz

CPU, elektronik ürünlerin çekirdeğidir ve bilgi endüstrisinin gelişim düzeyini temsil eder. CPU'nun gelişimi 40 yılı aşkın bir geçmişe sahiptir ve aslında Intel'in gelişiminin tarihidir. Intel'in CPU'su ve uyumlu ürünleri bilgisayarın çoğunu kaplar. Çin'in CPU stratejisi on yıldan fazla bir süredir geliştiriliyor ve bazı alanlarda çekirdek teknolojiler var ve sanayileşmede olumlu ilerleme kaydedildi, ancak uluslararası ana akım üreticiler Intel ile hala büyük bir boşluk var. Pek çok faktörün kısıtlamaları nedeniyle, yerel CPU'ların tek çekirdekli performansı düşüktür.2000 civarında, tüm mikroişlemci üreticileri çok çekirdekli mikroişlemcileri geliştirmeye yöneldi. CPU performansını artırmak için, yerel CPU'ların tümü çok çekirdekli tasarımlardır. Şu anda bazı ürünler parti, hükümet ve askeri departmanlarda ve önemli bilgi sistemlerinde kullanılsa da, endüstriyel ekoloji henüz kurulmadığından, uygulama senaryoları hala nispeten basit ve uygulamaları geliştirmek için kullanılabilecek programlama dili nispeten basit. Yerel CPU'nun gelişimi, Çin'in bilgi endüstrisinin temel rekabet gücü ve sürdürülebilir gelişimi ile ilgilidir. Yerli CPU'nun performansına tam anlamıyla oynama sağlamak için, paralel programlama ile çözülmesi gerekir.

Go dili tasarımının amaçlarından biri çok çekirdekli programlamadır.Çok iş parçacıklı bir programlama modeli kullanmaz.CSP tabanlı iletişim kanalları aracılığıyla eşzamanlı programlamayı kolaylaştırır. Go dili, yaygın olarak kullanılan X86 ve X64 komut setlerinin yanı sıra Loongson'un MIPS64 ve Feiteng'in ARM64 komut setlerini yerel olarak destekler. Bu, Go dili programlarına platformlar arası taşımada doğal bir avantaj sağlar. Go dilinin diğer bazı özellikleri, yerel CPU platformu uygulamasında çok geniş bir beklentiye sahip olmasını sağlar.

Go dili, Google tarafından Kasım 2009'da resmi olarak duyurulan bir programlama dilidir. Eşzamanlılık mekanizması, çok çekirdekli ve ağ iletişiminden tam olarak yararlanabilen programlar yazmayı çok kolaylaştırır. Go dili, statik olarak yazılmış bir dildir.Tip sistemi hiyerarşisi yoktur ve tamamen çöp toplanır. Tipik bir nesne yönelimli dilden daha hafiftir; Go dili, yorumlanmış bir dilin kullanım kolaylığını, dinamik yazmayı birleştiren derlenmiş bir dildir Dil gelişiminin etkinliği ve statik yazmanın güvenliği.

Go derleyicisi, x86, x64, ARM, arm64, ppc64, ppc64le, mips, mipsle, mips64, mips64le, s390x dahil olmak üzere birden çok farklı CPU komut setini destekler. FreeBSD, Linux, Solaris ve Windows dahil olmak üzere birden çok işletim sistemini destekleyebilir. Go dili, platformlar arası, işletim sistemleri arası bir dildir ve dağıtım çok basittir. Go, glibc dışında hiçbir harici bağımlılık içermeyen statik bir yürütülebilir dosya derler ve oluşturur. Go iyi bir eşzamanlılığa sahiptir ve gorutinler ve kanallar, sunucu programlaması için çok uygun olan yüksek eşzamanlı sunucu yazılımı yazmayı kolaylaştırır. Şu anda, Go dilinin başarılı projeleri, daha popüler bulut çerçeveleri Docker ve NSQ gibi dağıtılmış çerçeveleri içerir.

2 Yerli CPU platformunun tanıtımı ve uygulama durumu

Şu anda, Çin'in bağımsız olarak geliştirdiği işlemci çipleri başlıca Loongson (MIPS64 komut seti), Shenwei (Alfa komut seti), Feiteng (ARM64 komut seti) ve Zhaoxin (X86 komut seti) içerir. Ticari alanda Loongson 3B1500 CPU ve Feiteng FA1500A CPU tabanlı ticari sunucular, yerel sunucuların ana akım konumunu işgal eder.Loongson ve Feiteng sunucuları sırasıyla kazanan Kylin ve Galaxy Kylin işletim sistemleriyle donatılmıştır.

Ticari alanda, ulusal üretim platformu yeni başladı, ticari yazılımı destekleyen küçük ve tam bir endüstriyel ekoloji kurulmadı.Aynı zamanda işlemcinin kendisinin performansından da etkileniyor.Yukarıdaki iki ana işlemci platformuna dayalı sunucular esas olarak kullanılmaktadır. Yüksek sistem erişimi eşzamanlılığı ve yanıt süresi gerektirmeyen Web sitesi benzeri ağ uygulama hizmetleri için kullanılır. Yerli işlemci uygulama hizmetlerinin geliştirilmesi, açık kaynak JBoss, Ttomcat veya yerel ara yazılım ile hala Java diline dayanmaktadır ve veri tabanı, yerel veri tabanlarını veya MySQL gibi açık kaynak veri tabanlarını kullanır.

Yerel platformlarda Go dilinin 3 avantajı

3.1 Yerel platformlarda mevcut programlama dillerinin olmaması

Şu anda, yalnızca C ve C ++ derleyicileri, yerel olarak üretilen CPU'lara dayalı yerel olarak yapılan platformlar için nispeten olgunlaşmıştır. Üretici, Java sanal makinesini yerel platformda derler, uyarlar ve optimize eder. Java uygulamalarının çalışma sürecinde kullandığı çok sayıda Java üçüncü taraf çerçevesi X86 mimari sisteminden türetildiği ve yerel CPU'lar için optimize edilmediği için, bazı uygulamalar yüksek basınç veya büyük eşzamanlılık gibi belirli senaryolarda askıya alınmış animasyon ve kesinti yaşayacaktır. , Uygulamanın normal çalışmasını ciddi şekilde etkiler. Yerli platformlar Python, PHP vb. Diğer programlama dillerini de desteklese de bu betik dillerinin yorumlayıcıları da çapraz derleme ile elde edilir ve kendileri tarafından desteklenmez.Çok platformlar arası çapraz derleme sırasında çeşitli problemlerle karşılaşılacak ve birçok problem Yazılım geliştiricileri, kapsamlı uyarlama doğrulaması olmadan yazılım kaynak kodunu değiştirir ve geliştirdikleri uygulamaların kararlılığını sağlamak zordur.

3.2 Go dilinin çapraz platform ve eşzamanlılık avantajları

Go dili, Loongson CPU'nun MIPS64le komut setini ve doğası gereği çapraz platform olan Feiteng CPU'nun ARM64 komut setini yerel olarak destekler. Go geliştirme uygulamaları, herhangi bir platformun geliştirilmesi tamamlandıktan sonra doğrudan derlenir ve derlenen ikili dosyalar doğrudan kopyalanabilir ve yeniden derlenmeden benzer platformlarda çalıştırılabilir. Glibc'ye ek olarak, herhangi bir dış bağımlılık gerekmez. Java gibi bir sanal makineye ihtiyaç duymadan ve karmaşık ortam değişkenlerini yapılandırmadan, geliştirme platformundaki herhangi bir bilgisayarda doğrudan çalışabilir; bir ağ hizmeti olarak Tomcat, Apache vb. Gibi Web ara yazılımları gerektirmez.

Go dilinin heterojen platformlara taşınması da çok basittir, sadece uygulamanın kaynak kodunu gerektirir ve heterojen platformda doğrudan derlenebilir ve derlenen ikili dosya doğrudan kopyalanabilir ve aynı platform üzerinde çalıştırılabilir. Go dilinin kendisi, dağıtılmış heterojen bilgi işlem platformları geliştirme zorluğunu büyük ölçüde azaltan doğal bir çapraz platform avantajına sahiptir ve mevcut çok mimarili yerelleştirilmiş platformda bir geliştirme dili olarak çok uygundur.

Go dilindeki eşzamanlılık açısından, gorutin ve kanal mekanizmaları hafif bir eşzamanlılık mekanizması sağlar; performans açısından Java'nınkiyle karşılaştırılabilir Bellek kaynağı tüketimi açısından, Java ve diğer dinamik dillere göre bariz avantajları vardır. Ağ ve HTTP uygulamaları açısından, Go dili iyi bir standart kitaplığa ve ekosistem desteğine sahiptir ve standart kitaplıklar açısından, çeşitli ağları işlemek için gereken hafif bir kod kitaplığı sağlamıştır ve yüksek düzeyde ağ çekirdek protokolü HTTP'ye sahiptir. Eşzamanlılık desteği Java'yı tamamen sallayabilir. Yerli işlemciler, komut seti ve teknoloji gibi çeşitli nedenlerden dolayı düşük tek çekirdekli hesaplama performansına sahiptir.Genel hesaplama gücünü geliştirmek için çok çekirdekli teknoloji benimsenmiştir. Örneğin, Loongson 3B1500'ün 8 çekirdeği, ticari sunucunun çift 16 çekirdeği (23B1500) ve Feiteng FT1500A sunucusunun 16 çekirdeği vardır. Bu nedenle, çok çekirdekli bilgi işlem yeteneklerinden tam olarak yararlanmak veya yerel işlemcilere dayalı bir bulut bilgi işlem platformu oluşturmak, genel performansı iyileştirmek için yerel platformların mevcut geliştirme yönüdür.

4 Go dilinin ev ortamında taşınması

Feiteng platformunu örnek olarak ele alalım, Feiteng CPU, ARM64 mimarisini benimser. İlk olarak, X86 platformunda ARM64 platformu için Go dili önyükleme aracını çapraz derleyin, ARM64 platformunda çalışabilen Go dili önyükleme aracını derlemek için $ GOOS = linux GOARCH = arm64. / Bootstrap.bash derleme komutunu kullanın ve ardından Go kaynak kodunu ARM64 platformunda derlemek ve yüklemek için bu önyükleme aracını kullanın. Kurulumdan sonra Go dili otomatik olarak kendini test edecektir. Test tamamlandıktan sonra, TÜM TESTLER GEÇTİ sorar, GOROOT'u sistem ortam değişkenine ekleyin. Go dilinin taşınması tamamlandı. Loongson platformu geçiş süreci ile Feiteng platformu geçiş süreci arasındaki fark, önyükleyici derlendiğinde GOARCH parametresinin MIPS64le olarak ayarlanmasıdır.

5 Go dilinin çok çekirdekli çalışma prensibine giriş

Go dili, çok çekirdekli hesaplamaları hızlı ve verimli bir şekilde çağırabilir ve avantajları, Go dilinin Go çalışma zamanı programlayıcısından kaynaklanır.

Kullanıcı alanı iş parçacıkları ve çekirdek uzay evreleri arasındaki eşleme ilişkisinin üç genel iş parçacığı modeli vardır: N: 1, 1: 1 ve M: N. N: 1 modeli, birkaç kullanıcı alanı iş parçacığının bir işletim sistemi iş parçacığı üzerinde çalışmasıdır. Model bağlam anahtarı çok hızlıdır, ancak çok çekirdekli sistemden yararlanamaz. 1: 1 model: Bir yürütme iş parçacığı, bir işletim sistemi iş parçacığıyla eşleşir. Makinedeki tüm çekirdeklerden yararlanır, ancak içerik değiştirme daha yavaştır çünkü işletim sistemi aracılığıyla yapılması gerekir.

Go, yukarıdaki iki yöntemin en iyi sonuçlarını elde etmek için M: N zamanlayıcıyı kullanır. İstenilen sayıda goroutini herhangi bir sayıdaki işletim sistemi iş parçacığına gönderir. Geliştiriciler hızlı bağlam değiştirebilir ve sistemdeki tüm çekirdekleri kullanabilir. Bu yöntemin ana dezavantajı, programlayıcının karmaşıklığını arttırmasıdır.

Zamanlama görevini tamamlamak için, Go Scheduler Şekil 1'de gösterildiği gibi üç ana varlık kullanır.

M üçgeni, OS iş parçacığını temsil eder. Bu, işletim sistemi tarafından yönetilen bir yürütme iş parçacığıdır ve çalışma prensibi standart bir POSIX iş parçacığına benzer.

G dairesi bir gorutini temsil eder. Engellenebilecek herhangi bir kanal gibi yığın, yönerge işaretçisi ve program planlaması hakkında diğer önemli bilgileri içerir.

P, N: 1 programlayıcısından M: N programlayıcısına kadar önemli bir parçadır ve programlama bağlamını temsil eder. Bunu, Go kodunu tek bir iş parçacığı, kısmi bir zamanlayıcı üzerinde çalıştıran bir zamanlayıcı olarak düşünün.

Şekil 2'de gösterildiği gibi, 2 iş parçacığı (M) vardır, her iş parçacığı bir içeriğe (P) sahiptir ve her iş parçacığı bir gorutini (G) çalıştırır. Grupları çalıştırmak için iş parçacığı bir bağlam içermelidir.

P sayısı, gerçek eşzamanlılık derecesini, yani aynı anda kaç tane gorutinin çalışabileceğini temsil eden GOMAXPROCS tarafından ayarlanabilir. 4 çekirdekli bir bilgisayarda 4 iş parçacığı Go kodu çalıştırmak gibi, Go işleminden bilgisayara aramayı ayarlamak için kullanabilirsiniz.

Beyaz gorutinler çalışmıyor, hazır durumda ve programlanmayı bekliyor. P bu kuyruğu korur. Go dilinde, bir gorutin bir go ifadesini her yürüttüğünde, gorutinler kuyruğun sonuna eklenir. Bağlam, programlama noktasına kadar bir gorutini çalıştırdığında, çalıştırma kuyruğundan bir gorutini çıkaracak, yığını ve komut işaretçisini ayarlayacak ve gorutini çalıştırmaya başlayacaktır.

Şekil 3'te, bir OS iş parçacığı engellendiğinde, P başka bir sistem iş parçacığına dönebilir. Şekilden, bir M0 dişi bloke edildiğinde, P'nin OS dişi M1 üzerinde çalışmaya döndüğü görülebilir. Zamanlayıcı, tüm P'yi çalıştırmak için yeterli iş parçacığı olmasını sağlar.

M1, iş parçacığı önbelleğinden oluşturulabilir veya alınabilir. Sistem çağrısı geri döndüğünde, döndürülen gorutini çalıştırmak için bir bağlam elde etmeye çalışmalıdır. Normal şartlar altında, diğer sistem iş parçacıklarından bir bağlam elde eder. Eğer almazsa, gorutini global bir sıraya koyar ve koyar. İş parçacığı önbelleğinde. Bağlam periyodik olarak global kuyruğu kontrol edecektir, aksi takdirde global kuyruktaki goroutin asla çalıştırılmayacaktır.

Bu, bağlamın çalıştırma kuyruğunun iş yükü Şekil 4'te gösterildiği gibi dengesizse gerçekleşebilir. P tarafından atanan G görevi hızlı bir şekilde yürütülür (düzensiz dağıtım), bu da boşta olan ve sistem meşgul olan bir bağlam P ile sonuçlanır. Bir bağlam bittiğinde, çalıştırma sırasının yaklaşık yarısını başka bir bağlamdan çalmaya çalışır. Bu, her bağlamda her zaman yapılacak işin olmasını sağlar ve bu da tüm iş parçacıklarının maksimum kapasitede çalışmasını ve her sistem iş parçacığının tam olarak kullanılabilmesini sağlar.

Yerel platformlarda ölçülen çok çekirdekli Go dili çağrıları

6.1 Paralel İntegral Hesaplama Prensibi

Noktaları paralel olarak hesaplayın. İntegrali hesaplama, eşzamanlı programlamayı ve kendi ivmesini (çok işlemcili yürütme süresinin tek işlemcili yürütme süresine oranını temsil eden) göstermek için kullanılan yaygın bir örnektir, örneğin f (x) işlevinin integrali:

Gorutin (koroutin), np alt operatör gruplarının paralel çalışmasını gerçekleştirmek için bir döngüde tetiklenir ve Pi'nin integrali Go kodu ile hesaplanır:

6.2 Go Dil Paralel Hesaplama Temel Kodunun Uygulanması

Çekirdek kod:

Yukarıdaki hesaplamada, fonksiyon bloğu (start, end int, c chan float64) tarafından bir hesaplama grubu gerçekleştirilir, bu fonksiyon baştan sona dikdörtgen alanı hesaplar ve sonunda kanal (kanal) c kullanılır. Hesaplama grubunun sonuçlarını senkronize etme ve ana iş parçacığına gönderme zamanı. Ana iş parçacığı, rutime.GOMAXPROCS (np) 'yi çağırarak çalışma zamanında kullanılan CPU çekirdek sayısını belirler; burada np, kullanılan CPU sayısıdır ve ardından paralel hesaplamayı sağlamak için make to block aracılığıyla np boyutunda önbelleğe sahip bir kanal oluşturur. Son olarak, np zamanlarını çalıştırmanın sonuçları, pi'nin sonucunu elde etmek için toplanır.

6.3 Ev içi CPU çok çekirdekli çağrı testinde dil paralel hesaplamaya gidin

6.3.1 Test ortamı

Feiteng platformu: FT1500A16 çekirdek × 1; bellek 16 GB; Go derleyici 1.8.1; işletim sistemi: Galaxy Kylin 4.0.

Loongson platformu: 3B1500A8 çekirdek × 2; bellek 16 GB; Go derleyici 1.8.1; işletim sistemi: Kirin 6.0 teklifini kazanın.

6.3.2 Test yöntemi

Programda zamanlama, her test 3 kez, en kısa süreyi alır. Sonuçlar Şekil 5 ve Şekil 6'da gösterilmektedir.

Yukarıdaki iki veri grafiği seti, Loongson 3B1500 işlemci ve Feiteng FT1500A'da, paralel Go hesaplama Pi'nin verimliliğinin küçük problem boyutları (n = 105, 106) için birden fazla çekirdek kullanımının yürütme süresini artıramadığını göstermektedir. Çoklu süreç çizelgeleme ve eşgüdümlerin başlatılması nedeniyle, çoğu zaman paralel hesaplamalar gerçekleştirilmez. Problem boyutu n büyüdüğünde (n = 108, 109, 1010), çoklu işlemcilerin kullanımı hesaplama için gereken yürütme süresini önemli ölçüde kısaltabilir.

6.3.3 Sonuçların karşılaştırılması

Sonuçların karşılaştırması Şekil 7'de gösterilmektedir.

Şekil 7'den görülebileceği gibi, diğer halka açık testlerin verileri temelde aynıdır Feiteng FT1500A'nın hem tek çekirdekli hem de çok çekirdekli performansı Loongson 3B1500CPU'dan neredeyse iki kat daha hızlıdır.

6.4 Paralel hesaplama için birden çok çekirdek çağırmada Go dilinin doğrusal performans özellikleri

Eşzamanlı yürütmenin hızlanmasını yansıtmak için, Feiteng F1500A'yı örnek olarak alın ve formül (6) ile hızı hesaplayın:

Burada Tnp ve TMaxnp, işlemci tarafından halihazırda kullanılan çekirdek sayısını ve işlemcinin maksimum çekirdek sayısını hesaplamak için kullanılan zamanı hesaplamak için kullanılan zamandır. Sonuç, Şekil 8'de gösterilmektedir.

Şekil 8'de, problem ölçeği çok büyük olduğunda, büyüme neredeyse doğrusaldır, özellikle problem ölçeği (n = 109) ulaştığında, hemen hemen uyan trend çizgisine denk gelir.

7. Karar

Bu makale, Go dilinin heterojen platformlarda çok iş parçacıklı programlamadaki avantajlarını ve programlamanın zorluğunu açıklar; ticari uygulamalar alanında yerel olarak üretilen CPU'ların mevcut durumunu analiz eder. Çok çekirdekli aramaları iki yaygın yerel platformda test etmek için Go dilini kullanın. Aynı zamanda Go dilinin çok çekirdekli çalışma prensibini kısaca analiz eder. Özetle, Go dili, Java'nın yanı sıra bir başka yerel CPU platformu uygulama geliştirme dili olarak çok uygundur ve daha geniş bir uygulama olasılığına sahiptir. Bu makale, Go dilinin yerel CPU platformunda gelecekteki gelişimi ve uygulaması için belirli bir referans değeri sağlar.

Referanslar

Rui Xue, Wang Liangliang, Yang Qin. Yerli İşlemcilerin Araştırma ve Geliştirme Durumuna Genel Bakış Modern Bilgisayar (Popüler Baskı), 2014 (3): 15-19.

MORSING D. The Go planlayıcısı.2013.

yazar bilgileri:

Chen Xi, Hu Bin

(Ulusal Endüstriyel Bilgi Güvenliği Geliştirme Araştırma Merkezi, Pekin 100040)

Yeraltı yer değiştirme ölçüm sensörü dizisi için kablosuz bir güç aktarım cihazının tasarımı
önceki
"Game of the Brave" becerileri açıldı, Dashi Johnson, bir Jedi kaçışını aşmak ve sahnelemek için bir ekibi yönetiyor
Sonraki
"Tavuk çok güzelsin" Cai Xukun
Google, Çinli cep telefonu satıcıları, Huawei, Xiaomi vb. Veya kendi geliştirdiği sistemleri ücretlendirir.
Roadstar.ai Tong Xianqiao: Şirketin nedeni bir veya iki kişi değil Titanium Haberleri
"Endüstrinin Etkin Noktaları" 2050'ye kadar, yeni enerji enerjisi üretiminin küresel payı% 50'ye ulaşacak
"Han Shi Tie" dan "Cuju Resim" e: Mezarları süpürüp atalara tapınmanın yanı sıra Cuju gezileri de var.
Güç kaybetmeden oyun oynayın, süper pil ömrü cep telefonu önerisi
Büyük güçlerin yükselişi! IC pazarı Çin'e kayıyor! 2018 yılında pazar büyüklüğünün 1,5 trilyona yaklaşacağı tahmin ediliyor!
Çok yüksek boşanma: Bezos dünyanın en zengin erkeğini tutuyor, aldatıyor ama en zarif eski karısıyla tanışıyor
Benbang Technology CEO'su Liu Guiping, kendi raporunda: Birbirini kullanmak yerine birbirini başarmak gerçek arkadaşlıktır.
"Dragon Ball Fighter Z" yeni DLC ekran görüntüsü: Beni 20 kez yumruk kralı yiyin
"Sektördeki etkin nokta" Google, resmi olarak Android 9.0'ı piyasaya sürdü, Android Pie adlı 7 ana öğeyi güncelledi
Süper kahramanı diriltebilen zaman taşına ek olarak, bir kuantum bilgisayar da var mı?
To Top