/openmp
(Aktifkan Dukungan OpenMP)
Menyebabkan pengkompilasi memproses #pragma omp
arahan untuk mendukung OpenMP.
Sintaks
/openmp
/openmp:experimental
/openmp:llvm
/openmp
Keterangan
#pragma omp
digunakan untuk menentukan Arahan dan Klausul. Jika /openmp
tidak ditentukan dalam kompilasi, pengkompilasi mengabaikan klausa dan arahan OpenMP. Panggilan Fungsi OpenMP diproses oleh pengkompilasi meskipun /openmp
tidak ditentukan.
Pengkompilasi C++ saat ini mendukung standar OpenMP 2.0. Visual Studio 2019 juga sekarang menawarkan fungsionalitas SIMD. Untuk menggunakan SIMD, kompilasi menggunakan /openmp:experimental
opsi . Opsi ini memungkinkan fitur OpenMP yang biasa, dan fitur OpenMP SIMD tidak tersedia saat menggunakan sakelar /openmp
.
Mulai dari Visual Studio 2019 versi 16.9, Anda dapat menggunakan opsi eksperimental /openmp:llvm
alih-alih /openmp
menargetkan runtime LLVM OpenMP. Dukungan saat ini tidak tersedia untuk kode produksi, karena DLL libomp yang diperlukan tidak dapat didistribusikan ulang. Opsi ini mendukung arahan OpenMP 2.0 yang sama dengan /openmp
. Dan, ini mendukung semua arahan SIMD yang didukung oleh /openmp:experimental
opsi . Ini juga mendukung indeks bilangan bulat yang tidak ditandatangani secara paralel untuk perulangan sesuai dengan standar OpenMP 3.0. Untuk informasi selengkapnya, lihat Peningkatan Dukungan OpenMP untuk C++ di Visual Studio.
Opsi ini /openmp:llvm
mendukung arsitektur x64. Dimulai dengan Visual Studio 2019 versi 16.10, visual studio juga mendukung arsitektur x86 dan ARM64. Opsi ini tidak kompatibel dengan /clr
atau /ZW
.
Aplikasi yang dikompilasi dengan menggunakan keduanya /openmp
dan /clr
hanya dapat dijalankan dalam satu proses domain aplikasi. Beberapa domain aplikasi tidak didukung. Artinya, ketika konstruktor modul (.cctor
) dijalankan, ia mendeteksi apakah proses dikompilasi menggunakan /openmp
, dan jika aplikasi dimuat ke dalam runtime non-default. Untuk informasi selengkapnya, lihat appdomain
, /clr
(Kompilasi Runtime Bahasa Umum), dan Inisialisasi Rakitan Campuran.
Jika Anda mencoba memuat aplikasi yang dikompilasi menggunakan dan /openmp
/clr
ke domain aplikasi non-default, TypeInitializationException pengecualian dilemparkan di luar debugger, dan OpenMPWithMultipleAppdomainsException
pengecualian dilemparkan ke debugger.
Pengecualian ini juga dapat dimunculkan dalam situasi berikut:
Jika aplikasi Anda dikompilasi menggunakan
/clr
tetapi tidak/openmp
, dan dimuat ke dalam domain aplikasi non-default, di mana prosesnya menyertakan aplikasi yang dikompilasi menggunakan/openmp
.Jika Anda
/clr
meneruskan aplikasi ke utilitas, seperti regasm.exe, yang memuat rakitan targetnya ke dalam domain aplikasi non-default.
Keamanan akses kode runtime bahasa umum tidak berfungsi di wilayah OpenMP. Jika Anda menerapkan atribut keamanan akses kode CLR di luar wilayah paralel, atribut tersebut tidak akan berlaku di wilayah paralel.
Microsoft tidak menyarankan Agar Anda menulis /openmp
aplikasi yang mengizinkan pemanggil tepercaya sebagian. Jangan gunakan AllowPartiallyTrustedCallersAttribute, atau atribut keamanan akses kode CLR apa pun.
Untuk mengatur opsi pengkompilasi ini di lingkungan pengembangan Visual Studio
Buka kotak dialog Halaman Properti proyek. Untuk detailnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.
Perluas halaman properti Properti>Konfigurasi C/C++>Language.
Ubah properti Dukungan OpenMP.
Untuk mengatur opsi pengkompilasi ini secara terprogram
- Lihat OpenMP.
Contoh
Sampel berikut menunjukkan beberapa efek startup kumpulan utas versus menggunakan kumpulan utas setelah dimulai. Dengan asumsi x64, inti tunggal, prosesor ganda, kumpulan utas membutuhkan waktu sekitar 16 ms untuk memulai. Setelah itu, ada sedikit biaya tambahan untuk kumpulan utas.
Saat Anda mengkompilasi menggunakan /openmp
, panggilan kedua ke test2 tidak pernah berjalan lebih lama daripada jika Anda mengkompilasi menggunakan /openmp-
, karena tidak ada startup kumpulan utas. Pada satu juta iterasi, /openmp
versi lebih cepat daripada /openmp-
versi untuk panggilan kedua ke test2. Pada 25 iterasi, keduanya /openmp-
dan /openmp
versi mendaftar kurang dari granularitas jam.
Jika Anda hanya memiliki satu perulangan dalam aplikasi Anda dan berjalan dalam waktu kurang dari 15 ms (disesuaikan untuk perkiraan overhead pada komputer Anda), /openmp
mungkin tidak sesuai. Jika lebih tinggi, Anda mungkin ingin mempertimbangkan untuk menggunakan /openmp
.
// cpp_compiler_options_openmp.cpp
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
volatile DWORD dwStart;
volatile int global = 0;
double test2(int num_steps) {
int i;
global++;
double x, pi, sum = 0.0, step;
step = 1.0 / (double) num_steps;
#pragma omp parallel for reduction(+:sum) private(x)
for (i = 1; i <= num_steps; i++) {
x = (i - 0.5) * step;
sum = sum + 4.0 / (1.0 + x*x);
}
pi = step * sum;
return pi;
}
int main(int argc, char* argv[]) {
double d;
int n = 1000000;
if (argc > 1)
n = atoi(argv[1]);
dwStart = GetTickCount();
d = test2(n);
printf_s("For %d steps, pi = %.15f, %d milliseconds\n", n, d, GetTickCount() - dwStart);
dwStart = GetTickCount();
d = test2(n);
printf_s("For %d steps, pi = %.15f, %d milliseconds\n", n, d, GetTickCount() - dwStart);
}
Lihat juga
Opsi pengkompilasi MSVC
Sintaks baris perintah pengkompilasi MSVC
OpenMP di MSVC