/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 omp
Yö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 /openmp
destekler. 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 /ZW
ile /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 /openmp
derlenip 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/openmp
derlenmemişse ve işlemi kullanılarak/openmp
derlenmiş 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
Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.
Yapılandırma Özellikleri>C/C++>Dil özellik sayfasını genişletin.
OpenMP Desteği özelliğini değiştirin.
Bu derleyici seçeneğini program üzerinden ayarlamak için
- Bkz. OpenMP.
Ö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 /openmp
derleme 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