Kami terus meninjau komputer domestik baru. Setelah berkenalan singkat dengan fitur arsitektur Elbrus, kami akan mempertimbangkan alat pengembangan perangkat lunak yang ditawarkan kepada kami.
Ingat struktur artikel:- ulasan perangkat keras :
- proses akuisisi;
- perangkat keras
- ulasan perangkat lunak :
- peluncuran sistem operasi;
- perangkat lunak reguler;
- ikhtisar alat pengembangan:
- kinerja pembandingan :
- Deskripsi komputer saingan
- hasil benchmark;
- meringkas.
Selamat membaca!Fitur arsitektur
Inti dari arsitektur E2K dalam satu kalimat dapat dirumuskan sebagai berikut: register 64-bit, paralelisme eksplisit dari eksekusi instruksi dan akses memori yang dikontrol secara ketat.Sebagai contoh, prosesor arsitektur x86 atau SPARC yang mampu mengeksekusi lebih dari satu instruksi per siklus (superscalar), dan kadang-kadang juga rusak, tersiratparalelisme: prosesor langsung secara real time menganalisis dependensi antara instruksi pada bagian kecil kode dan, jika dianggap memungkinkan, memuat aktuator tertentu pada saat yang sama. Kadang-kadang dia bertindak terlalu optimis, - spekulatif, dengan membuang hasil atau mengembalikan transaksi jika prediksi tidak berhasil. Kadang-kadang, sebaliknya, itu terlalu pesimis - mengasumsikan ketergantungan antara nilai-nilai register atau bagian-bagian register, yang sebenarnya tidak dari sudut pandang program yang dapat dieksekusi.Jika eksplisitparalelisme (komputasi instruksi paralel paralel, EPIC) analisis yang sama terjadi pada tahap kompilasi, dan semua instruksi mesin yang ditentukan untuk eksekusi paralel ditulis dalam satu kata instruksi yang sangat besar (VLIW) - dan Elbrus memiliki panjang ini "Kata-kata" tidak tetap dan dapat dari 1 hingga 8 kata ganda (dalam konteks ini, satu kata memiliki kapasitas 32 bit).Tidak diragukan lagi, kompiler memiliki peluang yang jauh lebih besar dalam hal jumlah kode yang dibahas, waktu dan memori yang dihabiskan, dan ketika menulis kode mesin secara manual, programmer dapat melakukan optimasi yang lebih cerdas. Tapi ini dalam teori, dan dalam praktiknya Anda tidak mungkin menggunakan assembler, dan karena itu semuanya tergantung pada seberapa bagus kompiler pengoptimal itu, dan menulis satu bukanlah tugas yang mudah, untuk sedikitnya. Selain itu, jika, dengan paralelisme implisit, instruksi "lambat" dapat terus bekerja tanpa memblokir penerimaan instruksi berikut pada aktuator lain, maka dengan paralelisme eksplisit seluruh perintah lebar akan menunggu penyelesaian lengkap. Akhirnya, kompiler yang mengoptimalkan akan sedikit membantu dalam menafsirkan bahasa dinamis.Semua ini dipahami dengan baik di MCST, tentu saja, dan karenanya, Elbrus juga mengimplementasikan teknologi eksekusi spekulatif, kode dan data yang dimuat sebelumnya, dan operasi komputasi gabungan. Oleh karena itu, alih-alih berteori dan bertanya-tanya berapa banyak gigaflop hipotetis yang dapat diberikan platform ini atau itu di bawah serangkaian keadaan yang berhasil, pada bagian keempat artikel ini kita hanya mengambil dan mengevaluasi kinerja aktual dari program nyata - diterapkan dan sintetis.VLIW: terobosan atau jalan buntu?, VLIW : , ‑ Transmeta Crusoe — «». , Efficeon ( ) . , x86- , . , Pentium M , Pentium 4 , . VIA C3, x86.
Karena sifatnya yang eksotis, teknologi pelaksanaan program yang dilindungi dalam bahasa C / C ++, di mana penggunaan pointer memberikan berbagai peluang untuk menembak diri sendiri, tidak kalah menarik. Konsep perlindungan kontekstual, yang diimplementasikan bersama oleh kompiler pada tahap perakitan dan prosesor pada saat runtime, serta sistem operasi dalam hal manajemen memori, tidak akan membiarkan ruang lingkup variabel dilanggar - baik itu mengakses variabel kelas privat, data pribadi modul lain, variabel lokal fungsi panggilan . Manipulasi apa pun dengan mengubah tingkat akses hanya diizinkan untuk mengurangi hak. Menyimpan tautan ke objek berumur pendek dalam struktur berumur panjang diblokir. Upaya juga dicegah dari menggunakan tautan mati: jika objek yang menerima tautan itu telah dihapus,bahkan di lokasi lain, fasilitas baru di alamat yang sama tidak akan dianggap sebagai alasan untuk mengakses isinya. Didorong untuk menggunakan data sebagai kode dan mentransfer kontrol di mana saja.Memang, begitu kita beralih dari idiom level tinggi ke pointer level rendah, semua area visibilitas ini ternyata tidak lebih dari garam sintaksis. Beberapa kasus (paling sederhana) penyalahgunaan pointer kadang-kadang dapat membantu menangkap penganalisa kode sumber statis. Tetapi ketika program sudah diterjemahkan ke dalam instruksi mesin x86 atau SPARC, maka tidak ada yang akan mencegahnya membaca atau menulis nilai dari sel memori yang salah atau ukuran yang salah, yang akan menyebabkan crash di tempat yang sama sekali berbeda - dan di sini Anda duduk, melihat tumpukan yang rusak dan Anda tidak tahu harus mulai dari mana, karena pada mesin lain kode yang sama berhasil dipenuhi. Dan stack overflow dan kerentanan yang dihasilkan hanyalah momok dari platform populer. Sangat memuaskan bahwa pengembang kami secara sistematis mendekati masalah ini,dan tidak terbatas pada menata lebih banyak dan lebih banyak kruk, yang efeknya masih menyerupai garu. Lagi pula, tidak ada yang peduli seberapa cepat program Anda bekerja jika tidak bekerja dengan benar. Selain itu, kontrol yang lebih ketat oleh kompiler memaksa Anda untuk menulis ulang "foul smelling" dan kode yang tidak dapat ditoleransi, yang berarti secara tidak langsung meningkatkan budaya pemrograman.Urutan byte saat menyimpan angka dalam memori Elbrus, tidak seperti SPARC, adalah sedikit endian (byte bawah lebih dulu), yaitu pada x86. Demikian pula, karena platform ini bertujuan untuk mendukung kode x86, tidak ada batasan pada penyelarasan data dalam memori.Ketertiban, Perataan, dan Portabilitas , Intel, , (, 32‑ 0x04000005) — , , , . - , , , — , ( , UTF‑16), , , , ‑. , , — , SPARC, — .
Anda dapat membaca lebih lanjut tentang desain komputer MCST pada arsitektur SPARC dan E2K dalam buku "Mikroprosesor dan Komputasi Komputasi Keluarga Elbrus", yang diterbitkan oleh Peter Publishing House dalam proses cetak minimal dan telah lama dijual, tetapi tersedia secara gratis dalam bentuk PDF ( 6 MB ) dan dengan sedikit biaya di Google Play . Dengan latar belakang kurangnya informasi terperinci lainnya dalam domain publik, publikasi ini hanyalah gudang pengetahuan. Tetapi teks terkonsentrasi terutama pada perangkat keras, algoritma operasi buffer dan pipa, cache dan perangkat aritmatika-logika - topik penulisan program [efektif] sama sekali tidak dibahas, dan bahkan hanya menyebutkan instruksi mesin dapat dihitung dengan jari.Bahasa mesin
Selain mengkompilasi bahasa tingkat tinggi C, C ++, Fortran, dokumentasi di setiap kesempatan tidak lupa menyebutkan kemungkinan menulis program secara langsung di Assembler, tetapi tidak ditentukan bagaimana tepatnya Anda bisa terlibat dalam seni kerawang ini, di mana setidaknya Anda bisa mendapatkan referensi ke instruksi mesin. Untungnya, sistem memiliki debugger GDB yang dapat membongkar kode program yang sebelumnya dikompilasi. Agar tidak melampaui ruang lingkup artikel, kami menulis fungsi aritmatika sederhana yang memiliki jaminan simpanan yang baik untuk paralelisasi.uint64_t CalcParallel(
uint64_t a,
uint64_t b,
uint64_t c,
uint32_t d,
uint32_t e,
uint16_t f,
uint16_t g,
uint8_t h
) {
return (a * b) + (c * d) - (e * f) + (g / h);
}
Inilah yang diterjemahkan ketika mengkompilasi dalam mode -O3 :0x0000000000010490 <+0>:
muld,1 %dr0, %dr1, %dg20
sxt,2 6, %r3, %dg19
getfs,3 %r6, _f32,_lts2 0x2400, %g17
getfs,4 %r5, _lit32_ref, _lts2 0x00002400, %g18
getfs,5 %r7, _f32,_lts3 0x200, %g16
return %ctpr3
setwd wsz = 0x5, nfx = 0x1
setbp psz = 0x0
0x00000000000104c8 <+56>:
nop 5
muld,0 %dr2, %dg19, %dg18
muls,3 %r4, %g18, %g17
sdivs,5 %g17, %g16, %g16
0x00000000000104e0 <+80>:
sxt,0 6, %g17, %dg17
addd,1 %dg20, %dg18, %dg18
0x00000000000104f0 <+96>:
nop 5
subd,0 %dg18, %dg17, %dg17
0x00000000000104f8 <+104>:
sxt,0 2, %g16, %dg16
0x0000000000010500 <+112>:
ct %ctpr3
ipd 3
addd,0 %dg17, %dg16, %dr0
Hal pertama yang menarik perhatian Anda adalah bahwa setiap perintah diterjemahkan segera menjadi beberapa instruksi yang dijalankan secara paralel. Penunjukan instruksi mnemonik umumnya intuitif, meskipun beberapa nama tampak tidak biasa setelah Intel: misalnya, instruksi ekstensi yang tidak ditandatangani di sini disebut sxt , bukan movzx . Parameter dari banyak perintah komputasi, selain operan itu sendiri, adalah jumlah perangkat eksekutif - bukan tanpa alasan bahwa ELBRUS adalah penjadwalan pemanfaatan sumber daya dasar yang eksplisit, yaitu, “perencanaan eksplisit untuk penggunaan sumber daya dasar”.Untuk mengakses nilai register 64-bit penuh, awalan “ d"; dalam teori, dimungkinkan juga untuk mengakses nilai bit 16 dan 8 yang lebih rendah. Penunjukan register tujuan umum global, yang ada 32 buah, diawali dengan " g " sebelum nomor , dan prosedur lokal mendaftar dengan awalan " r ". Ukuran jendela register lokal yang diminta oleh instruksi setwd dapat mencapai 224, dan pompa didorong ke tumpukan secara otomatis sesuai kebutuhan.Cara Anda menerapkan instruksi tertentu membingungkan: misalnya, kembaliseperti yang Anda duga, ini berfungsi untuk mengembalikan kontrol ke prosedur pemanggilan, namun, dalam semua sampel kode yang dipelajari, instruksi ini muncul jauh sebelum perintah terakhir (di mana beberapa jenis manipulasi konteks juga ada), kadang-kadang bahkan dalam kata perintah pertama, seperti di sini. Meskipun buku tersebut membayar seluruh paragraf untuk masalah ini, itu belum menjadi jelas bagi kami. Pembaruan pada 9 Februari 2016: komentar menunjukkan bahwa pernyataan pengembalian hanya menyiapkan cara untuk kembali dari subprogram dan memungkinkan prosesor untuk mulai memuat perintah berikutnya dari prosedur pemanggilan, dan kontrol itu sendiri kembali ketika eksekusi mencapai instruksi ct .Namun, "kode yang mudah dibaca" dan "kode efisien" jauh dari sama ketika datang ke instruksi mesin. Jika Anda mengkompilasi tanpa optimasi, maka kode lebih konsisten dan mirip dengan perhitungan dahi, tetapi dengan biaya perpanjangan: alih-alih 6 kata perintah jenuh, 8 yang jarang dihasilkan.Sesi bercerita tentang kopi untuk sim, mari kita selesaikan sebelum kita berfantasi dengan asumsi yang benar-benar konyol. Mari kita berharap bahwa suatu hari referensi perintah dan panduan pemrograman dan optimasi akan dipublikasikan.Alat pengembangan
Kompiler bahasa C / C ++ standar dalam sistem operasi Elbrus adalah LCC, pengembangan hak milik perusahaan MCST, yang kompatibel dengan GCC. Informasi terperinci tentang struktur dan prinsip-prinsip kompiler ini tidak dipublikasikan, tetapi menurut wawancara dengan mantan pengembang salah satu dari beberapa subspesies yang dikembangkan dari kompiler, Edison Design Group menggunakan frontend untuk analisis kode sumber tingkat tinggi. , dan terjemahan tingkat rendah ke instruksi mesin dapat dilakukan dengan berbagai cara - tanpa optimasi atau dengan optimasi. Ini adalah kompiler pengoptimal yang dikirimkan kepada pengguna akhir, tidak hanya pada platform E2K, yang tidak ada generator kode mesin alternatif, tetapi juga pada platform platform SPARC, di mana GCC biasa sebagai bagian dari sistem operasi MSVS juga tersedia.Mempertimbangkan fitur arsitektural yang tercantum di atas - konkurensi yang jelas, eksekusi program yang aman - kompiler LCC jelas mengimplementasikan banyak solusi unik yang layak dipelajari dan diuji dalam praktiknya. Sayangnya, pada saat menulis baris-baris ini, penulis tidak memiliki kualifikasi yang memadai untuk ini, atau waktu untuk studi tersebut; Saya berharap cepat atau lambat masalah ini akan ditangani oleh lingkaran perwakilan yang lebih luas dari komunitas TI, termasuk yang lebih kompeten.Dari apa yang berhasil Anda perhatikan dengan mata telanjang saat membangun program untuk menguji kinerja, LCC pada E2K lebih sering daripada yang lain memberi peringatan tentang kemungkinan kesalahan, konstruksi yang buta huruf, atau sekadar tempat mencurigakan dalam kode. Benar, penulis tidak begitu mengenal GCC untuk menjamin perbedaan antara pesan-pesan LCC unik dalam bahasa Rusia dan yang hanya diterjemahkan (apalagi, terjemahannya selektif), dan saya tidak yakin bahwa aliran peringatan yang lebih intens bukanlah konsekuensi dari konfigurasi perakitan yang diselesaikan secara otomatis. Juga, karena tidak mengetahui semantik dari bagian kode tertentu, terkadang sulit untuk memahami seberapa pintar kompiler dalam menemukan bug tersembunyi, atau meningkatkan alarm palsu. Sebagai contoh, dalam kode Postgresql, konstruk yang sama ditemukan empat kali dalam file yang sama dengan sedikit variasi:for (i = 0, ptr = cont->cells; *ptr; i++, ptr++) {
if ((*ptr)[strspn(*ptr, " \t")] == '\0')
fputs(" ", fout);
else
html_escaped_print(*ptr, fout);
}
Compiler memprediksi kemungkinan jalan keluar dari array 1 dimensi dalam sebuah string dengan pemanggilan fungsi strspn . Dalam keadaan apa ini bisa terjadi, penulis tidak mengerti (dan tidak ada peringatan seperti itu pada platform lain, meskipun mode cek adalah Warray-boundsadalah standar untuk GCC), namun, perlu dicatat bahwa beberapa replikasi dari desain non-sepele yang sama (karena itu perlu untuk menjelaskan tujuannya dalam komentar), alih-alih menempatkannya ke dalam fungsi terpisah dengan nama yang fasih yang tidak memerlukan penjelasan. Sekalipun alarm ternyata salah, mendeteksi kode yang berbau busuk adalah efek yang berguna; penulis analisa statis Studio - PVS akan dibiarkan tanpa pekerjaan. Namun serius, akan lucu dan bermanfaat untuk membandingkan kesalahan tambahan apa dalam kode yang benar-benar mampu dideteksi oleh LCC karena fitur unik arsitektur E2K - pada saat yang sama, dunia perangkat lunak bebas dapat menerima kumpulan laporan bug lainnya.Hasil lain dari kenalan penasaran dengan LCC banyak bicara adalah penulis pendidikan, dan kemudian rekan yang lebih berpengalaman nya, apa trigraphs ( trigraphs ) dalam bahasa C / C ++, dan mengapa mereka tidak didukung secara default, untungnya. Anda hidup seperti ini dan jangan curiga bahwa kombinasi tanda baca yang kelihatannya tidak berbahaya dalam literal teks atau komentar dapat berubah menjadi bom waktu - atau bahan yang sangat baik untuk bookmark program, tergantung di sisi mana barikade Anda berada.Konsekuensi yang tidak menyenangkan dari kemandirian LCC adalah bahwa format pesannya berbeda dari GCC, dan ketika dikompilasi dari lingkungan pengembangan (misalnya, Qt Creator), pesan-pesan ini hanya termasuk dalam log pekerjaan umum, tetapi tidak dalam daftar masalah yang dikenali. Mungkin ini dapat dikustomisasi dalam beberapa cara, baik dari sisi kompiler atau dalam lingkungan pengembangan, tetapi setidaknya di luar kotak itu tidak saling memahami.Secara tradisional akut untuk platform domestik, mengingat kinerjanya yang relatif rendah, ada masalah kompilasi silang, yaitu, perakitan program untuk arsitektur target dan seperangkat pustaka sistem tertentu, menggunakan sumber daya komputer yang lebih kuat, dengan arsitektur yang berbeda dan perangkat lunak lain. Dilihat oleh garis identifikasi di inti sistem Elbrus dan di kompiler LCC itu sendiri, mereka dirakit di Linux i386, tetapi toolkit ini untuk x86, tentu saja, tidak termasuk dalam paket distribusi sistem itu sendiri. Ini menarik, tetapi mungkinkah melakukan yang sebaliknya: pada Elbrus untuk mengumpulkan program untuk platform lain? (Penulis tidak berhasil lebih jauh dari fase pertama rakitan GCC untuk i386.)Versi paket paling signifikan untuk pengembang:- kompiler: lcc 1.19.18 (gcc 4.4.0 kompatibel);
- : erlang 15.b.1, gawk 4.0.2, lua 5.1.4, openjdk 1.6.0_27 (jvm 20.0‑b12), perl 5.16.3, php 5.4.11, python 2.7.3, slang 2.2.4, tcl 8.6.1;
- : autoconf 2.69, automake 1.13.1, cmake 2.8.10.2, distcc 3.1, m4 1.4.16, make 3.81, makedepend 1.0.4, pkgtools 13.1, pmake 1.45;
- : binutils 2.23.1, elfutils 0.153, patchelf 0.6;
- : boost 1.53.0, qt 4.8.4, qt 5.2.1;
- : expat 2.1.0, ffi 3.0.10, gettext 0.18.2, glib 2.36.3, glibc 2.16.0, gmp 4.3.1, gtk+ 2.24.17, mesa 10.0.4, ncurses 5.9, opencv 2.4.8, pcap 1.3.0, popt 1.7, protobuf 2.4.1, sdl 1.2.13, sqlite 3.6.13, tk 8.6.0, usb 1.0.9, wxgtk 2.8.12, xml‑parser 2.41, zlib 1.2.7;
- : cppunit 1.12.1, dprof 1.3, gdb 7.2, perf 3.5.7;
- : anjuta 2.32.1.1, glade 2.12.0, glade 3.5.1, qt‑creator 2.7.1;
- : bzr 2.2.4, cvs 1.11.22, git 1.8.0, patch 2.7, subversion 1.7.7.
Sekali lagi, jika Anda mengharapkan GCC 5, PHP 7, dan Java 9, maka ini adalah masalah Anda, seperti yang dikatakan oleh seorang pemain sepakbola terkenal. Dalam hal ini, saya juga harus mengucapkan terima kasih bahwa paling tidak GCC 3.4.6 (LCC 1.16.12), seperti dalam versi sebelumnya dari sistem Elbrus, atau GCC 3.3.6 dalam komposisi MSVS 3.0; By the way, kompiler utama di MSVS 3.0 masih GCC 2.95.4 (dan mengapa terkejut ketika ada kernel dari cabang 2.4?). Dibandingkan dengan situasi sebelumnya, ketika ada kemungkinan untuk menemukan bug GCC yang diperbaiki di hulu sepuluh tahun yang lalu, sistem baru ini memiliki kondisi yang sangat mempesona - Anda bahkan dapat menggeseknya dalam C ++ 11 jika Anda tidak ingin mempertahankan kompatibilitas ke belakang.Munculnya OpenJDK, setidaknya dalam beberapa bentuk, sudah bisa disebut sebagai terobosan besar, karena tidak suka untuk Jawa dan Monodalam sistem seperti itu sudah lama dikenal; dan ketidaksukaan ini dapat dipahami ketika bahkan program asli hampir tidak bergerak. Karena ada banyak orang Jawa di antara rekan penulis, karena keadaan di atas, dipaksa untuk menahan jiwa-jiwa impuls indah, diputuskan untuk mencurahkan serangkaian tes kinerja terpisah ke Jawa. Ke depan, kami mencatat bahwa hasilnya mengecewakan bahkan dalam hal relatif: dengan keberhasilan yang sama, Anda dapat menulis skrip yang ditafsirkan dalam PHP atau Python, mungkin.Dukungan untuk C dan C ++ saja tidak terbatas pada kompatibilitas dengan GNU Compiler Collection: sistem masih memiliki penerjemah Fortran. Karena penulis hanya akrab dengan Profesor Fortran, siapa pun yang tertarik dapat merekomendasikan topik Desember pada "Made with Us", di mana komentar menyentuh tentang penggunaan bahasa ini sebagai patokan.Untuk hidangan penutup, kami menyediakan yang paling lezat: bagian terakhir dari artikel ini ditujukan untuk mempelajari kinerja Elbrus dibandingkan dengan berbagai platform perangkat keras dan perangkat lunak, termasuk yang domestik.