Bertahun-tahun yang lalu, saya terkejut ketika saya menemukan bahwa Intel menjual kompiler Visual Studio yang kompatibel. Saya mencobanya secara khusus untuk C / C ++ serta alat diagnostik yang fantastis. Tetapi kode itu tidak begitu intensif secara komputasi untuk melihat perbedaannya. Satu-satunya kesan adalah: apakah Intel benar-benar melakukannya untuk saya sekarang, wow, alat luar biasa dengan resolusi nanodetik, sulit dipercaya. Namun uji coba berakhir dan tim tidak pernah dengan serius mempertimbangkan pembelian.
Dari pengalaman Anda, jika biaya lisensi tidak masalah, vendor mana yang menjadi pemenang?
Ini bukan pertanyaan luas atau tidak jelas atau upaya untuk memicu perang suci. Pertanyaan semacam ini adalah tentang dua alat yang sangat terlihat. Tidak ada yang suka ketika alat memiliki misteri atau kejutan. Dan pilihan antara yang terbaik dan yang terbaik selalu merupakan rasa sakit. Saya juga mengerti bahwa argumen rumput selalu lebih hijau . Saya ingin mendengar semua cerita "bagaimana jika".
Bagaimana jika Intel hanya mengoptimalkannya secara lokal untuk chip bulan ini, dan tidak semua target perangkat keras akan berfungsi sebagaimana Microsoft dikompilasi? Bagaimana jika perangkat keras AMD adalah target dan semuanya akan melambat tanpa alasan? Atau di sisi lain, bagaimana jika perangkat keras Intel memiliki begitu banyak peluang yang tidak terlihat, sehingga penulis kompiler Microsoft terlalu lambat untuk mengadopsi dan tidak pernah mengimplementasikannya dalam kompiler? Bagaimana jika keduanya sama persis, sebenarnya basis kode tunggal hanya dibungkus menjadi dua kotak yang berbeda dan dilisensikan ke kedua vendor oleh beberapa toko pihak ketiga?
Dan seterusnya. Tetapi seseorang tahu beberapa jawaban.
Jawaban:
PERINGATAN: Jawab berdasarkan pengalaman sendiri - YMMV
Jika kodenya benar-benar mahal secara komputasi, ya, pasti . Saya telah melihat peningkatan lebih dari 20 kali dengan Intel C ++ Compiler (sekarang Intel Studio jika saya ingat dengan benar) vs standar Microsoft Visual C ++ Compiler. Memang benar kode itu sangat jauh dari sempurna dan yang mungkin telah memainkan peran (sebenarnya itu sebabnya kami repot menggunakan kompiler Intel, itu lebih mudah daripada refactoring basis kode raksasa), juga CPU yang digunakan untuk menjalankan kode adalah Intel Core 2 Quad, yang merupakan CPU sempurna untuk hal semacam itu, tetapi hasilnya mengejutkan. Kompiler itu sendiri berisi banyak sekali cara untuk mengoptimalkan kode, termasuk menargetkan CPU tertentu dalam hal, katakanlah, kemampuan SSE . Itu benar-benar membuat
-O2
/-O3
melarikan diri malu. Dan itu tadisebelum menggunakan profiler.Perhatikan bahwa, menyalakan optimisasi yang sangat agresif akan membuat kompilasi memakan waktu cukup lama, dua jam untuk proyek besar bukan tidak mungkin sama sekali. Juga, dengan optimasi tingkat tinggi, ada kemungkinan kesalahan kode yang lebih tinggi untuk memanifestasikan dirinya (ini dapat diamati dengan gcc
-O3
juga). Untuk proyek yang Anda kenal dengan baik, ini bisa menjadi nilai tambah, karena Anda akan menemukan dan memperbaiki bug yang mungkin tidak Anda temui sebelumnya, tetapi ketika menyusun kekacauan berbulu, Anda cukup menyilangkan jari dan berdoa kepada dewa x86.Sesuatu tentang kinerja pada mesin AMD: Ini tidak sebagus CPU Intel, tetapi masih jauh lebih baik daripada kompiler MS C ++ (sekali lagi, dari pengalaman saya). Alasannya adalah Anda juga dapat menargetkan CPU generik dengan dukungan SSE2 (misalnya). Maka CPU AMD dengan SSE2 tidak akan banyak dibedakan. Kompiler Intel pada CPU Intel benar-benar mencuri perhatian. Namun, tidak semua pelangi ganda dan unicorn mengkilap. Ada beberapa tuduhan berat tentang binari yang tidak berjalan sama sekali pada CPU non-GenuineIntel dan (yang ini diakui) secara buatan diinduksi kinerja rendah pada CPU oleh vendor lain. Juga perhatikan ini adalah informasi dari setidaknya 3 tahun yang lalu dan validitasnya seperti yang sekarang tidak diketahui, TETAPI deskripsi produk baru memberikan biner carte blanche untuk berjalan selambat yang Intel lihat cocok pada CPU non-Intel.
Saya tidak tahu apa itu tentang Intel dan mengapa mereka membuat alat perhitungan numerik yang sangat bagus, tetapi lihat juga: http://julialang.org/ . Ada perbandingan dan jika Anda melihat baris terakhir, MATLAB bersinar dengan mengalahkan kode C dan Julia , yang mengejutkan saya adalah bahwa menurut penulis alasannya adalah Perpustakaan Matematika Kernel Intel .
Saya menyadari ini kedengarannya sangat mirip iklan untuk toolkit Intel Compiler, tetapi dalam pengalaman saya itu benar-benar melakukan pekerjaan dengan baik, dan bahkan logika sederhana menentukan bahwa orang-orang yang membuat CPU harus tahu cara terbaik memprogram untuk mereka. IMO, kompiler Intel C ++ memeras setiap bit terakhir dari peningkatan kinerja yang mungkin terjadi.
sumber
Intel Compiler memiliki reputasi menghasilkan kode numerik yang sangat efisien:
https://stackoverflow.com/questions/1733627/anyone-here-has-benchmarked-intel-c-compiler-and-gcc
http://www.open-mag.com/754088105111.htm
http://www.freewebs.com/godaves/javabench_revisited/
Harap dicatat bahwa saya tidak mengklaim bahwa itu adalah kompiler tercepat di luar sana, tetapi tentu saja menikmati reputasi yang sangat baik untuk efisiensi. Perhatikan bahwa penulis binari LAPACK "resmi" untuk Windows menggunakan kompiler Intel Fortran untuk membangunnya: http://icl.cs.utk.edu/lapack-for-windows/ dan mereka harus mengetahui satu atau dua hal tentang efisiensi.
sumber
Intel C ++ memiliki beberapa keunggulan dibandingkan gcc selain dari pembuat kode. Kedua hal ini (sebagian besar) berasal dari fakta bahwa itu didasarkan pada EDG front-end. Baik atau buruk, kedua hal ini (perlahan) terkikis, sehingga keuntungannya tidak sebesar yang dulu.
Yang pertama adalah bahwa ia mengeluarkan pesan kesalahan yang jauh lebih baik sebagai aturan. Anda mungkin ingin melihat perbandingan pesan kesalahan antara Dentang dan gcc. Intel C ++ (bersama dengan yang lainnya berdasarkan EDG front-end) telah mengeluarkan diagnostik yang mirip dengan Clang selama bertahun-tahun.
Kedua, adalah bahwa ujung depan EDG juga terkenal karena kesesuaian bahasa yang sangat baik dengan generator kode Intel untuk menghasilkan kode cepat. Dengan hampir semua ukuran yang masuk akal, EDG front-end memberikan kesesuaian yang lebih baik dengan C ++ 98, 03, atau (dalam versi saat ini) C ++ 0x daripada kompiler lain yang tersedia.
Seperti yang saya katakan, kedua keunggulan ini telah terkikis ke berbagai tingkat dari waktu ke waktu. Versi terbaru gcc memiliki kesesuaian bahasa yang cukup baik. Dentang memiliki pesan kesalahan yang jauh lebih baik, dan membuat kemajuan yang baik menuju implementasi seluruh bahasa C ++ juga. Namun, ketika Anda langsung melakukannya, Intel C ++ masih lebih baik daripada salah satu dari keduanya, dan ini adalah satu paket yang melakukan banyak hal dengan benar daripada membutuhkan satu kompiler untuk diagnostik yang baik dan yang lain untuk kesesuaian dan pembuatan kode yang lebih baik.
sumber
Kami mencoba ini di tempat kerja beberapa waktu lalu. Sebagian besar basis kode kami ada di Delphi, tetapi kami memiliki beberapa fungsionalitas yang sangat intensif secara komputasi yang menurut seseorang akan menjadi ide yang baik untuk dilakukan dalam C ++ DLL ketika. Dan salah satu rekan kerja saya telah mendengar banyak hal hebat tentang kompiler Intel, jadi dia memutuskan untuk mencobanya. Kami membangun kembali DLL dalam kompiler Intel dan menjalankan beberapa tes kecepatan, dan hasilnya sangat mengejutkannya sehingga ia merasa harus melakukan sesuatu yang salah.
DLL harus menghitung beberapa masalah yang sangat sulit dengan komponen kombinatorik dan topologi, yang secara teknis di kelas kesulitan NP-keras jika kita melakukannya "benar", tetapi kami menggunakan berbagai heuristik untuk menghindari kinerja NP. Meski begitu, ada banyak angka yang terjadi. Dan untuk pengujian yang kami jalankan, perbedaan antara kompiler VS dan kompiler Intel ada di dalam epsilon, atau kompiler Intel terasa lebih lambat, umumnya di suatu tempat di lingkungan sekitar 20%. Dan tetap seperti itu tidak peduli perubahan apa pun yang ia buat pada pengaturan kompilasi untuk mencoba membuat kompiler Intel menghasilkan kode yang lebih cepat. Jadi kami akhirnya tidak beralih ke sana.
Ini hanya satu contoh dunia nyata, tentu saja. Jarak tempuh Anda mungkin beragam.
sumber
Dalam aplikasi tertanam yang pernah saya kerjakan, percobaan dari kompiler Intel menunjukkan itu akan menyelamatkan kita dari keharusan untuk memutar perangkat keras baru dengan kinerja yang lebih tinggi. Biaya perangkat keras baru adalah sekitar $ 10 / unit, proyeksi penjualan 1 Juta unit, Tambahkan biaya pengembangan dan penundaan proyek. Opsi 2 adalah profil / mikro mengoptimalkan basis kode yang sudah diprofilkan / dioptimalkan dengan baik - hasil yang tidak diketahui, waktu yang tidak diketahui.
Menurut Anda apa yang dikatakan bos ketika kami meminta dana untuk membeli kompiler .......
Namun - ini adalah kasus tepi yang sangat beruntung dan jarang - keluaran kode 10% lebih cepat dari kompiler Intel mendorong kami kembali ke sisi kinerja yang benar. Jika kita sudah di sisi kanan, atau lebih dari 10%, itu tidak akan membuat perbedaan. Seandainya kami memiliki insinyur, kami mungkin bisa mengoptimalkan kode dan menyelamatkan putaran perangkat keras dan tidak memerlukan kompiler Intel, Tetapi risikonya tinggi dan kompiler Intel bekerja lebih murah daripada waktu rekayasa.
Pada keseimbangan saya akan mengatakan itu adalah bentuk optimasi mikro - jangan lakukan sampai Anda tahu Anda perlu, dan kemudian, hanya setelah Anda membuat profil dan menemukan penyebab sebenarnya dari masalah. Ini adalah pilihan yang sangat baik dari profil Anda menunjukkan Anda lambat 'di mana-mana' dan tidak memiliki leher botol yang diidentifikasi.
sumber
Saya hanya menemukan tiga keuntungan:
Ini memiliki dukungan untuk fitur-fitur dari CPU Intel yang lebih baru jauh lebih cepat daripada kompiler lain.
Ini adalah kompiler tambahan yang bagus untuk mengeluarkan peringatan dan menangkap masalah yang dilewatkan oleh kompiler lain. GCC menangkap beberapa hal yang tidak dimiliki ICC, dan sebaliknya. Studio visual menangkap beberapa hal yang tidak dimiliki ICC, dan sebaliknya.
Ia melakukan pekerjaan yang jauh lebih baik dari loop penjajaran otomatis (mendistribusikannya melalui beberapa utas secara otomatis) daripada kompiler lainnya. Tidak banyak manfaat kode dari ini, tetapi ketika Anda memiliki kode itu, itu bisa membuat perbedaan.
sumber
Kami menggunakan kompiler intel untuk setiap proyek kritikal kinerja basis kode kami. Yang hebat tentang itu adalah, itu membuat kode mengoptimalkan benar-benar dipertahankan. Alih-alih secara manual menambahkan __mm panggilan di mana-mana, dan memberi tahu kompiler untuk mengambil data sebelumnya, yang semuanya akan menjadi kurang optimal pada rilis berikutnya lagi, Anda hanya mengatur ulang kode Anda dan mendapatkan speedup yang gila.
Seringkali, kode yang dioptimalkan lebih mudah diikuti daripada yang dioptimalkan dengan tangan, lebih cepat daripada yang dioptimalkan dengan tangan, dan ketika set instruksi baru dilepaskan, kompiler akan menggunakan set instruksi itu. Fantastis.
Hal yang sama juga berlaku untuk kompiler lengan (dari lengan, bukan intel), jika Anda melepaskannya di lengan, melakukan pekerjaan yang baik dalam membuat vektor untuk Anda.
sumber
Periksa halaman benchmark ini. Singkatnya, intel menang.
Tetapi marginnya mungkin tidak sebesar itu: jika Anda mengkompilasi hingga 32 bit, dan sistem build Anda tidak dapat mendukung pengoptimalan yang dipandu profil, keuntungannya adalah di urutan 10%. Apakah peningkatan seperti itu sepadan dengan kesulitan dan waktu kompilasi yang lebih lama?
sumber
Dikatakan bahwa Intel telah merilis Intel C ++ Compiler v13.0 untuk Android OS, upaya pertamanya untuk memberikan kompiler C / C ++ yang dioptimalkan yang dirancang khusus untuk platform mobile Google.
Pengembang dapat menggunakan kompiler pada sistem berbasis Linux * untuk membuat aplikasi untuk perangkat Android berdasarkan pada prosesor Intel, termasuk prosesor Intel® Atom ™. Kompiler Intel kompatibel dengan GNU C ++ dan alat pengembang di Android Native Development Kit (NDK) Anda juga tidak dapat menggunakan kompiler pada mesin pengembangan apa pun. Baik Windows maupun OS X tidak didukung; alat hanya disertifikasi untuk digunakan dengan Ubuntu 10.04 atau 11.04
Versi Android NDK saat ini menggunakan versi 4.6 dari toolchain Gnu Compiler Collection (GCC) open source secara default. Tetapi kompiler Intel menyertakan banyak optimisasi kepemilikan untuk chipnya sendiri, dan seringkali dapat menghasilkan kode yang dapat dieksekusi yang berkinerja lebih baik daripada yang dihasilkan oleh kompiler pihak ketiga seperti GCC.
sumber