Visual Studio 2019
versi 16.3 dan 16.4 mencakup peningkatan pada inliner C ++. Di antara ini adalah kemampuan untuk menyesuaikan beberapa rutinitas setelah dioptimalkan, disebut sebagai "Zipliner." Bergantung pada aplikasi Anda, Anda mungkin melihat beberapa peningkatan kualitas kode minor dan / atau peningkatan waktu pembuatan utama (throughput kompiler).
Inline C2
Terry Mahaffey telah memberikan gambaran umum tentang
keputusan inlining Visual Studio . Ini merinci beberapa kendala dan bidang perbaikan inliner, beberapa di antaranya sangat relevan di sini:
- Inliner bersifat rekursif dan mungkin sering melakukan kembali pekerjaan yang telah dilakukan. Keputusan inline sensitif konteks dan tidak selalu menguntungkan untuk memutar ulang pengambilan keputusan untuk fungsi yang sama.
- Inliner sangat sadar anggaran. Ini memiliki pekerjaan yang sulit menyeimbangkan ukuran yang dapat dieksekusi dengan kinerja runtime.
- Pandangan dunia tentang dunia selalu "pra-dioptimalkan." Ini memiliki pengetahuan yang sangat terbatas tentang perbanyakan salinan dan jalur kontrol mati misalnya.
C ++ Modern
Sayangnya, banyak pola pengkodean dan idiom yang umum terjadi pada pemrograman generik berat menabrak kendala tersebut. Pertimbangkan rutinitas berikut di
perpustakaan Eigen :
Eigen::Matrix<float,-1,1,0,-1,1>::outerStride(void)
yang memanggil innerSize:
template<typename Derived> class DenseBase ... Index innerSize() const { return IsVectorAtCompileTime ? this->size() : int(IsRowMajor) ? this->cols() : this->rows(); }
Instansiasi outerStride tidak melakukan apa-apa selain mengembalikan salah satu anggotanya. Oleh karena itu, ini adalah kandidat yang sangat baik untuk ekspansi inline penuh. Untuk mewujudkan kemenangan ini meskipun kompiler harus sepenuhnya mengevaluasi dan memperluas 18 total callees outerStride, untuk setiap callsite dari outerStride dalam modul. Ini memakan baik throughput optimizer maupun anggaran ukuran kode inliner. Juga disebutkan bahwa panggilan ke 'baris' dan 'cols' juga diperluas inline, meskipun mereka berada di jalur yang mati secara statis.
Akan jauh lebih baik jika pengoptimal hanya menggariskan pengembalian anggota dua baris:
?outerStride@?$Matrix@N$0?0$0?0$0A@$0?0$0?0@Eigen@@QEBA_JXZ PROC ; Eigen::Matrix<double,-1,-1,0,-1,-1>::outerStride, COMDAT mov rax, QWORD PTR [rcx+8] ret 0
Inlining IR yang Dioptimalkan
Untuk subset rutin, inliner sekarang akan memperluas IR rutin yang sudah dioptimalkan, melewati proses pengambilan IR, dan memperluas kembali callees. Ini memiliki tujuan ganda untuk memperluas ruang panggil lebih cepat, serta membiarkan inliner mengukur anggarannya dengan lebih akurat.
Pertama, pengoptimal akan merangkum bahwa outerStride adalah kandidat untuk ekspansi yang lebih cepat ini ketika dikompilasi (Ingat bahwa c2.dll mencoba untuk mengkompilasi rutin sebelum penelepon mereka). Kemudian, inliner dapat mengganti panggilan ke instantiation outerStride dengan akses bidang.
Para kandidat untuk perluasan inline yang lebih cepat ini adalah fungsi daun tanpa penduduk setempat, yang merujuk paling banyak dua argumen, global, atau konstanta yang berbeda. Dalam praktiknya ini menargetkan getter dan setter paling sederhana.
Manfaat
Ada banyak contoh seperti outerStride di perpustakaan Eigen di mana pohon panggilan besar diperluas menjadi hanya satu atau dua instruksi. Modul yang banyak menggunakan Eigen dapat melihat peningkatan throughput yang signifikan; kami mengukur pengoptimal yang menghabiskan waktu hingga 25-50% lebih sedikit untuk repro tersebut.
Zipliner baru juga akan memungkinkan inliner untuk mengukur anggarannya dengan lebih akurat. Pengembang Eigen telah lama menyadari bahwa MSVC tidak sesuai dengan spesifikasinya (lihat EIGEN_STRONG_INLINE). Zipliner harus membantu meringankan beberapa masalah ini, karena rutinitas zipline sekarang dianggap sebaris "bebas".
Cobalah fitur ini
Ini diaktifkan secara default di Visual Studio 2019 16.3, bersama dengan beberapa perbaikan di 16.4. Silakan
unduh Visual Studio 2019 dan coba perbaikan baru. Kami dapat dihubungi melalui komentar di bawah ini atau melalui email (visualcpp@microsoft.com). Jika Anda mengalami masalah dengan Visual Studio atau MSVC, atau memiliki saran untuk kami, beri tahu kami melalui Bantuan> Kirim Umpan Balik> Laporkan Masalah / Berikan Saran dalam produk, atau melalui
Komunitas Pengembang . Anda juga dapat menemukan kami di Twitter (
@VisualC ).