Bagikan melalui


/openmp (Aktifkan Dukungan OpenMP)

Menyebabkan pengkompilasi memproses #pragma omp arahan untuk mendukung OpenMP.

Sintaks

/openmp
/openmp:experimental
/openmp:llvm

/openmp

Keterangan

#pragma ompdigunakan 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 meneruskan /clr 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

  1. Buka kotak dialog Halaman Properti proyek. Untuk detailnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.

  2. Perluas halaman properti Properti>Konfigurasi C/C++>Language.

  3. Ubah properti Dukungan OpenMP.

Untuk mengatur opsi pengkompilasi ini secara terprogram

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);
}

Baca juga

Opsi pengkompilasi MSVC
Sintaks baris perintah pengkompilasi MSVC
OpenMP di MSVC