/openmp (OpenMP Desteğini Etkinleştir)

Derleyicinin OpenMP'yi destekleyen yönergeleri işlemesine #pragma omp neden olur.

Sözdizimi

/openmp
/openmp:experimental
/openmp:llvm

/openmp

Açıklamalar

#pragma ompYönergeleri ve Yan Tümceleri belirtmek için kullanılır. Derlemede belirtilmezse /openmp , derleyici OpenMP yan tümcelerini ve yönergelerini yoksayar. OpenMP İşlev çağrıları, belirtilmemiş olsa /openmp bile derleyici tarafından işlenir.

C++ derleyicisi şu anda OpenMP 2.0 standardını destekler. Visual Studio 2019 artık SIMD işlevselliği de sunuyor. SIMD'yi kullanmak için seçeneğini kullanarak derleyin /openmp:experimental . Bu seçenek hem normal OpenMP özelliklerini hem de anahtarı kullanırken /openmp kullanılamayan OpenMP SIMD özelliklerini etkinleştirir.

Visual Studio 2019 sürüm 16.9'dan başlayarak LLVM OpenMP çalışma zamanını hedeflemek /openmp yerine deneysel /openmp:llvm seçeneğini kullanabilirsiniz. Gerekli libomp DLL'leri yeniden dağıtılmadığından şu anda üretim kodu için destek sağlanmamıştır. seçeneği ile aynı OpenMP 2.0 yönergelerini /openmpdestekler. Ayrıca seçeneği tarafından desteklenen tüm SIMD yönergelerini /openmp:experimental destekler. Ayrıca OpenMP 3.0 standardına göre döngüler için paralel olarak işaretsiz tamsayı dizinlerini destekler. Daha fazla bilgi için bkz . Visual Studio'da C++ için Geliştirilmiş OpenMP Desteği.

seçeneği /openmp:llvm x64 mimarisini destekler. Visual Studio 2019 sürüm 16.10'dan başlayarak, x86 ve ARM64 mimarilerini de destekler. Bu seçenek veya /ZWile /clr uyumlu değildir.

Hem hem de /openmp kullanılarak derlenen uygulamalar /clr yalnızca tek bir uygulama etki alanı işleminde çalıştırılabilir. Birden çok uygulama etki alanı desteklenmez. Yani modül oluşturucusu (.cctor) çalıştırıldığında, işlemin kullanılarak /openmpderlenip derlenmediğini ve uygulamanın varsayılan olmayan bir çalışma zamanına yüklenip yüklenmediğini algılar. Daha fazla bilgi için bkzappdomain. ,/clr(Ortak Dil Çalışma Zamanı Derlemesi)ve Karma Derlemelerin Başlatılması.

Hem hem de /openmp/clr kullanılarak derlenmiş bir uygulamayı varsayılan olmayan bir uygulama etki alanına yüklemeye çalışırsanız, hata ayıklayıcının dışında bir TypeInitializationException özel durum oluşturulur ve hata ayıklayıcıda bir OpenMPWithMultipleAppdomainsException özel durum oluşturulur.

Bu özel durumlar aşağıdaki durumlarda da oluşturulabilir:

  • Uygulamanız kullanılarak /clr derlenmiş ancak kullanılarak /openmpderlenmemişse ve işlemi kullanılarak /openmpderlenmiş bir uygulamayı içeren varsayılan olmayan bir uygulama etki alanına yüklenir.

  • Uygulamanızı/clr, hedef derlemelerini varsayılan olmayan bir uygulama etki alanına yükleyen regasm.exe gibi bir yardımcı programla geçirirseniz.

Ortak dil çalışma zamanının kod erişim güvenliği OpenMP bölgelerinde çalışmaz. Paralel bölge dışında bir CLR kod erişimi güvenlik özniteliği uygularsanız, paralel bölgede geçerli olmaz.

Microsoft, kısmen güvenilen arayanlara izin veren uygulamalar yazmanızı /openmp önermez. veya clr kodu erişimi güvenlik özniteliklerini kullanmayın AllowPartiallyTrustedCallersAttribute.

Bu derleyici seçeneğini Visual Studio geliştirme ortamında ayarlamak için

  1. Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.

  2. Yapılandırma Özellikleri>C/C++>Dil özellik sayfasını genişletin.

  3. OpenMP Desteği özelliğini değiştirin.

Bu derleyici seçeneğini program üzerinden ayarlamak için

Örnek

Aşağıdaki örnekte, iş parçacığı havuzu başlatmanın, başladıktan sonra iş parçacığı havuzunu kullanmaya kıyasla bazı etkileri gösterilmektedir. x64, tek çekirdekli, çift işlemcili bir işlemci olduğunu varsayarsak, iş parçacığı havuzunun başlatılması yaklaşık 16 ms sürer. Bundan sonra, iş parçacığı havuzu için çok az ek maliyet vardır.

kullanarak /openmpderleme yaptığınızda, iş parçacığı havuzu başlatma olmadığından test2'ye yapılan ikinci çağrı hiçbir zaman kullanarak /openmp-derleme yaptığınızdan daha uzun süre çalışmaz. Milyonlarca yinelemede /openmp sürüm, test2'ye yapılan ikinci çağrının sürümünden daha /openmp- hızlıdır. 25 yinelemede hem hem /openmp de /openmp- sürümler saat ayrıntı düzeyinden daha az kaydeder.

Uygulamanızda yalnızca bir döngü varsa ve 15 ms'den kısa bir süre içinde çalışıyorsa (makinenizdeki yaklaşık ek yük için ayarlanmışsa), /openmp uygun olmayabilir. Daha yüksekse kullanmayı düşünebilirsiniz /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);
}

Ayrıca bkz.

MSVC derleyici seçenekleri
MSVC derleyicisi komut satırı söz dizimi
MSVC'de OpenMP