Otomatik Paralelleştirme ve Otomatik Vektörleştirme
Otomatik Paralel hale Getirici ve Otomatik Vektörleştirici, kodunuzda döngüler için otomatik performans kazanımları sağlamak üzere tasarlanmıştır.
Otomatik Paralelleştirici
/Qpar derleyici anahtarı, kodunuzda döngülerin otomatik olarak paralelleştirilmesini sağlar. Var olan kodunuzu değiştirmeden bu bayrağı belirttiğinizde, derleyici paralelleştirmeden yararlanabilecek döngüleri bulmak için kodu değerlendirir. Çok fazla iş yapmayan ve bu nedenle paralelleştirmeden yararlanamayacak döngüler bulabildiği için ve her gereksiz paralelleştirme bir iş parçacığı havuzunun, ek eşitlemenin veya performansı geliştirmek yerine yavaş performansa neden olabilecek diğer işlemleri oluşturabildiğinden, derleyici paralelleştirdiği döngüleri seçme konusunda muhafazakardır. Örneğin, derleme zamanında döngünün üst sınırlarının bilinmediği aşağıdaki örneği göz önünde bulundurun:
void loop_test(int u) {
for (int i=0; i<u; ++i)
A[i] = B[i] * C[i];
}
u
Küçük bir değer olabileceğinden, derleyici bu döngünün otomatik olarak paralelleştirilmesine neden olmaz. Ancak, her zaman büyük olacağını bildiğiniz u
için paralel hale getirilmesini isteyebilirsiniz. Otomatik paralelleştirmeyi etkinleştirmek için #pragma döngüsü (hint_parallel(n)) belirtin; burada n
paralelleştirebileceğiniz iş parçacığı sayısıdır. Aşağıdaki örnekte, derleyici döngünün 8 iş parçacığı arasında paralelleştirilmesini deneyecektir.
void loop_test(int u) {
#pragma loop(hint_parallel(8))
for (int i=0; i<u; ++i)
A[i] = B[i] * C[i];
}
Tüm pragma yönergelerinde olduğu gibi alternatif pragma söz dizimi __pragma(loop(hint_parallel(n)))
de desteklenir.
İsteseniz bile derleyicinin paralelleştiremeyebileceği bazı döngüler vardır. Bir örnek aşağıda verilmiştir:
#pragma loop(hint_parallel(8))
for (int i=0; i<upper_bound(); ++i)
A[i] = B[i] * C[i];
İşlev upper_bound()
her çağrıldığında değişebilir. Üst sınır bilinemediğinden, derleyici bu döngünün neden paralelleştirilemeyeceğini açıklayan bir tanılama iletisi yayımlayabilir. Aşağıdaki örnekte paralelleştirilebilen bir döngü, paralelleştirilemeyen bir döngü, komut isteminde kullanılacak derleyici söz dizimi ve her komut satırı seçeneği için derleyici çıkışı gösterilmektedir:
int A[1000];
void test() {
#pragma loop(hint_parallel(0))
for (int i=0; i<1000; ++i) {
A[i] = A[i] + 1;
}
for (int i=1000; i<2000; ++i) {
A[i] = A[i] + 1;
}
}
Bu komutu kullanarak derleme:
cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:1
şu çıkışı verir:
--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized
Bu komutu kullanarak derleme:
cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:2
şu çıkışı verir:
--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized
d:\myproject\mytest.cpp(4) : loop not parallelized due to reason '1008'
Çıkışta iki farklı /Qpar-report (Otomatik Paralelleştirici Raporlama Düzeyi) seçeneği arasındaki farka dikkat edin. /Qpar-report:1
paralelleştirici iletilerini yalnızca başarıyla paralelleştirilmiş döngüler için verir. /Qpar-report:2
hem başarılı hem de başarısız döngü paralelleştirmeleri için paralelleştirici iletileri verir.
Neden kodları ve iletileri hakkında daha fazla bilgi için bkz . Vektörleştirici ve Paralelleştirici İletileri.
Otomatik Vektörleştirici
Otomatik Vektörleştiricisi, kodunuzdaki döngüleri analiz eder ve hedef bilgisayardaki vektör yazmaçlarını ve yönergelerini kullanarak yürütebilirse yürütür. Bu, kodunuzun performansını artırabilir. Derleyici, /arch anahtarına göre Intel veya AMD işlemcilerdeki SSE2, AVX ve AVX2 yönergelerini ya da ARM işlemcilerindeki NEON yönergelerini hedefler.
Otomatik Vektörleştiricisi, anahtar tarafından /arch
belirtilenden farklı yönergeler oluşturabilir. Bu yönergeler, kodun hala düzgün çalıştığından emin olmak için çalışma zamanı denetimi tarafından korunur. Örneğin, derleme /arch:SSE2
sırasında SSE4.2 yönergeleri yayılabilir. Çalışma zamanı denetimi, hedef işlemcide SSE4.2'nin kullanılabilir olduğunu doğrular ve işlemci bu yönergeleri desteklemiyorsa döngünün SSE4.2 olmayan bir sürümüne atlar.
Varsayılan olarak, Otomatik Vektörleştirici etkindir. Vektörleştirme altında kodunuzun performansını karşılaştırmak istiyorsanız, belirli bir döngünün vektörleştirmesini devre dışı bırakmak için #pragma döngüsü (no_vector) kullanabilirsiniz.
#pragma loop(no_vector)
for (int i = 0; i < 1000; ++i)
A[i] = B[i] + C[i];
Tüm pragma yönergelerinde olduğu gibi alternatif pragma söz dizimi __pragma(loop(no_vector))
de desteklenir.
Otomatik Paralel Hale Getirici'de olduğu gibi, yalnızca/Qvec-report:1
başarıyla vektörleştirilmiş döngüleri veya hem başarılı hem de başarısız vektörleştirilmiş döngüleri/Qvec-report:2
raporlamak için /Qvec-report (Otomatik Vektörleştirici Raporlama Düzeyi) komut satırı seçeneğini belirtebilirsiniz.
Neden kodları ve iletileri hakkında daha fazla bilgi için bkz . Vektörleştirici ve Paralelleştirici İletileri.
Vektörleştiricinin uygulamada nasıl çalıştığını gösteren bir örnek için bkz . Project Austin Bölüm 2 / 6: Page Curling
Ayrıca bkz.
loop
Yerel Kodda Paralel Programlama
/Qpar (Otomatik Paralel Hale Getirici)
/Qpar-report (Otomatik Paralel Hale Getirici Raporlama Düzeyi)
/Qvec-report (Otomatik Vektör Hale Getirici Raporlama Düzeyi)
Vektör Yapıcı ve Paralel Hale Getirici İletileri