/MP
(Bangun dengan beberapa proses)
Opsi /MP
ini dapat mengurangi total waktu untuk mengkompilasi file sumber pada baris perintah. Opsi ini /MP
menyebabkan pengkompilasi membuat satu atau beberapa salinan itu sendiri, masing-masing dalam proses terpisah. Kemudian instans ini secara bersamaan mengompilasi file sumber. Dalam beberapa kasus, total waktu untuk membangun file sumber dapat dikurangi secara signifikan.
Sintaks
/MP
[processMax
]
Argumen
processMax
(Opsional) Jumlah maksimum proses yang dapat dibuat pengkompilasi.
Argumen processMax
harus berkisar antara 1 hingga 65536. Jika tidak, kompilator mengeluarkan pesan peringatan D9014, mengabaikan processMax
argumen, dan mengasumsikan jumlah maksimum proses adalah 1.
Jika Anda menghilangkan processMax
argumen, pengkompilasi mengambil jumlah prosesor yang efektif di komputer Anda dari sistem operasi, dan membuat proses untuk setiap prosesor.
Keterangan
Opsi /MP
kompilator dapat secara signifikan mengurangi waktu build saat Anda mengkompilasi banyak file. Untuk meningkatkan waktu build, pengkompilasi membuat hingga processMax
salinan itu sendiri, lalu menggunakan salinan tersebut untuk mengkompilasi file sumber Anda secara bersamaan. Opsi ini /MP
berlaku untuk kompilasi, tetapi tidak untuk menautkan atau pembuatan kode waktu tautan. Secara default /MP
opsi nonaktif.
Peningkatan waktu build tergantung pada jumlah prosesor di komputer, jumlah file yang akan dikompilasi, dan ketersediaan sumber daya sistem, seperti kapasitas I/O. Bereksperimenlah /MP
dengan opsi untuk menentukan pengaturan terbaik untuk membangun proyek tertentu. Untuk saran untuk membantu Anda membuat keputusan tersebut, lihat Panduan.
Opsi dan fitur bahasa yang tidak kompatibel
Opsi /MP
ini tidak kompatibel dengan beberapa opsi pengkompilasi dan fitur bahasa. Jika Anda menggunakan opsi pengkompilasi yang tidak kompatibel dengan /MP
opsi , pengkompilasi mengeluarkan peringatan D9030 dan mengabaikan /MP
opsi . Jika Anda menggunakan fitur bahasa yang tidak kompatibel, kompilator mengeluarkan kesalahan C2813 kemudian berakhir atau berlanjut tergantung pada opsi tingkat peringatan kompilator saat ini.
Catatan
Sebagian besar opsi tidak kompatibel karena jika diizinkan, pengkompilasi yang mengeksekusi secara bersamaan akan menulis output mereka secara bersamaan ke konsol atau ke file tertentu. Akibatnya, output akan intermix dan kacau. Dalam beberapa kasus, kombinasi opsi akan membuat performa lebih buruk.
Tabel berikut ini mencantumkan opsi pengkompilasi dan fitur bahasa yang tidak kompatibel dengan /MP
opsi :
Opsi atau Fitur Bahasa | Deskripsi |
---|---|
#import direktif praproscesor |
Mengonversi jenis dalam pustaka jenis menjadi kelas C++, lalu menulis kelas tersebut ke file header. |
/E , /EP |
Menyalin output pra-prosesor ke output standar (stdout ). |
/Gm |
Ditolak. Mengaktifkan pembangunan kembali bertahas. |
/showIncludes |
Menulis daftar file yang disertakan ke kesalahan standar (stderr ). |
/Yc |
Menulis file header yang telah dikommpilasikan sebelumnya. |
Pesan diagnostik
Jika Anda menentukan opsi atau fitur bahasa yang tidak kompatibel dengan /MP
opsi , Anda akan menerima pesan diagnostik. Tabel berikut mencantumkan pesan dan perilaku pengkompilasi:
Pesan Diagnostik | Deskripsi | Perilaku Pengkompilasi |
---|---|---|
C2813 | Direktif #import tidak kompatibel dengan /MP opsi . |
Kompilasi berakhir kecuali opsi tingkat peringatan kompilator menentukan sebaliknya. |
D9014 | Nilai yang tidak valid ditentukan untuk processMax argumen . |
Pengkompilasi mengabaikan nilai yang tidak valid dan mengasumsikan nilai 1. |
D9030 | Opsi yang ditentukan tidak kompatibel dengan /MP . |
Pengkompilasi mengabaikan /MP opsi . |
Panduan
Mengukur performa
Gunakan total waktu build untuk mengukur performa. Anda dapat mengukur waktu build dengan jam fisik, atau Anda dapat menggunakan perangkat lunak yang menghitung perbedaan antara saat build dimulai dan berhenti. Jika komputer Anda memiliki beberapa prosesor, jam fisik mungkin menghasilkan hasil yang lebih akurat daripada pengukuran waktu perangkat lunak.
Prosesor yang efektif
Komputer dapat memiliki satu atau beberapa prosesor virtual, yang juga dikenal sebagai prosesor efektif, untuk setiap prosesor fisiknya. Setiap prosesor fisik dapat memiliki satu atau beberapa inti, dan jika sistem operasi memungkinkan hyperthreading untuk inti, setiap inti tampaknya dua prosesor virtual.
Misalnya, komputer memiliki satu prosesor yang efektif jika memiliki satu prosesor fisik yang memiliki satu inti, dan hyperthreading dinonaktifkan. Sebaliknya, komputer memiliki delapan prosesor yang efektif jika memiliki dua prosesor fisik, yang masing-masing memiliki dua inti, dan semua inti mengaktifkan hyperthreading. Artinya, (8 prosesor efektif) = (2 prosesor fisik) x (2 inti per prosesor fisik) x (2 prosesor efektif per inti karena hyperthreading).
Jika Anda menghilangkan processMax
argumen dalam /MP
opsi , pengkompilasi mendapatkan jumlah prosesor yang efektif dari sistem operasi, lalu membuat satu prosesor per prosesor yang efektif. Namun, pengkompilasi tidak dapat menjamin proses mana yang dijalankan pada prosesor tertentu; sistem operasi membuat keputusan tersebut.
Jumlah proses
Pengkompilasi menghitung jumlah proses yang akan digunakannya untuk mengkompilasi file sumber. Nilai tersebut adalah lebih sedikit dari jumlah file sumber yang Anda tentukan pada baris perintah, dan jumlah proses yang Anda tentukan secara eksplisit atau implisit dengan /MP
opsi . Anda dapat secara eksplisit mengatur jumlah maksimum proses jika Anda memberikan processMax
argumen /MP
opsi. Atau Anda dapat menggunakan default, yang sama dengan jumlah prosesor efektif di komputer, jika Anda menghilangkan processMax
argumen.
Misalnya, Anda menentukan baris perintah berikut:
cl /MP7 a.cpp b.cpp c.cpp d.cpp e.cpp
Dalam hal ini, pengkompilasi menggunakan lima proses karena itu adalah lebih sedikit dari lima file sumber dan maksimum tujuh proses. Atau, misalkan komputer Anda memiliki dua prosesor yang efektif dan Anda menentukan baris perintah berikut:
cl /MP a.cpp b.cpp c.cpp
Dalam hal ini, sistem operasi melaporkan dua prosesor, sehingga pengkompilasi menggunakan dua proses dalam perhitungannya. Akibatnya, pengkompilasi menggunakan dua proses untuk menjalankan build karena itu adalah lebih sedikit dari dua proses dan tiga file sumber.
File sumber dan urutan build
File sumber mungkin tidak dikompilasi dalam urutan yang sama di mana file tersebut muncul pada baris perintah. Meskipun kompilator membuat serangkaian proses yang berisi salinan kompilator, sistem operasi menjadwalkan ketika setiap proses dijalankan. Opsi /MP
tidak dapat menjamin bahwa file sumber akan dikompilasi dalam urutan tertentu.
File sumber dikompilasi ketika proses tersedia untuk mengkompilasinya. Jika ada lebih banyak file daripada proses, kumpulan file pertama dikompilasi oleh proses yang tersedia. File yang tersisa diproses ketika proses selesai menangani file sebelumnya dan tersedia untuk bekerja pada salah satu file yang tersisa.
Jangan tentukan file sumber yang sama beberapa kali pada baris perintah. Beberapa spesifikasi dapat terjadi, misalnya, jika alat secara otomatis membuat makefile yang didasarkan pada informasi dependensi dalam proyek. Jika Anda tidak menentukan /MP
opsi , pengkompilasi memproses daftar file secara berurutan dan mengkompilasi ulang setiap kemunculan file. Namun, jika Anda menentukan /MP
opsi , instans pengkompilasi yang berbeda mungkin mengkompilasi file yang sama secara bersamaan. Instans yang berbeda dapat mencoba menulis ke file output yang sama secara bersamaan. Satu instans kompilator memperoleh akses tulis eksklusif ke file output dan berhasil, dan instans kompilator lainnya gagal dengan kesalahan akses file.
Menggunakan pustaka jenis (#import
)
Pengkompilasi tidak mendukung penggunaan #import
direktif dengan sakelar /MP
. Jika memungkinkan, ikuti langkah-langkah berikut untuk mengatasi masalah ini:
Pindahkan semua arahan
#import
dalam berbagai file sumber Anda ke satu atau beberapa file, lalu kompilasi file-file tersebut/MP
tanpa opsi . Hasilnya adalah sekumpulan file header yang dihasilkan.Di file sumber Anda yang tersisa, sisipkan
#include
direktif yang menentukan header yang dihasilkan, lalu kompilasi file sumber Anda yang tersisa dengan menggunakan/MP
opsi .
Pengaturan Proyek Visual Studio
Alat MSBuild
Visual Studio menggunakan MSBuild
alat (msbuild.exe
) untuk membangun solusi dan proyek. /maxcpucount:number
Opsi baris perintah (atau /m:number
) dari alat MSBuild dapat membangun beberapa proyek secara bersamaan. /MP
Dan opsi kompilator dapat membangun beberapa unit kompilasi secara bersamaan. Jika sesuai untuk aplikasi Anda, tingkatkan waktu build solusi Anda dengan menggunakan atau keduanya /MP
dan /maxcpucount
.
Waktu build solusi Anda sebagian tergantung pada jumlah proses yang melakukan build. Argumen number
/maxcpucount
opsi MSBuild menentukan jumlah maksimum proyek yang akan dibuat secara bersamaan. Demikian pula, processMax
argumen /MP
opsi pengkompilasi menentukan jumlah maksimum unit kompilasi untuk dibangun secara bersamaan. /maxcpucount
Jika opsi menentukan proyek P dan /MP
opsi menentukan proses C, maksimum proses P x C dijalankan secara bersamaan.
Pedoman untuk memutuskan apakah akan menggunakan MSBuild atau /MP
teknologi adalah sebagai berikut:
Jika ada banyak proyek dengan beberapa file di setiap proyek, gunakan alat MSBuild dengan
/maxcpucount
opsi .Jika ada beberapa proyek dengan banyak file di setiap proyek, gunakan opsi .
/MP
Jika jumlah proyek dan file per proyek seimbang, gunakan MSBuild dan
/MP
. Awalnya atur/maxcpucount
opsi ke jumlah proyek yang akan dibangun dan/MP
opsi ke jumlah prosesor di komputer Anda. Ukur performa lalu sesuaikan pengaturan Anda untuk menghasilkan hasil terbaik. Ulangi siklus tersebut hingga Anda puas dengan total waktu build.
Lihat juga
#import
Direktif
Referensi baris perintah MSBuild
/Zf
(Pembuatan PDB yang lebih cepat)