2011-05-30 16 views
33

2 çok benzer çekirdek işlevine sahibim, kod neredeyse aynıdır, ancak küçük bir farkla. Şu anda 2 seçenek vardır:İki benzer kerneli 'if' ifadesiyle birleştirmeli miyim, performans kaybını riske atmalı mıyım?

  • Yaz 2 farklı yöntem (ama çok benzer olanlar)
  • tek çekirdek yaz ve ne kadar bir if/else

farklılık kod bloklarını koymak If ifadesi algoritma performansımı etkiler mi?
Herhangi bir dallanma olmadığını biliyorum, çünkü tüm bloklardaki tüm parçacıklar ya, ya da diğerine girecektir.
Çekirdek işlevi çok kez çağrıldığında tek bir if ifadesi performansımı azaltır mı?

+4

Neden hem de zaman o denemiyorsunuz? – Bart

cevap

91

C++ şablonunu kullanmak ve if/switch ifadesinde kullanılan değişkeni bir şablon parametresi yapmak olan üçüncü bir alternatifiniz vardır. İhtiyacınız olan çekirdeğin her bir sürümünü örneklendirin ve daha sonra birden çok çekirdek farklı bir şey yapmanıza gerek yok, aksi takdirde şube sapması ya da koşullu değerlendirme endişelenmeyin, çünkü derleyici ölü kodu ve onunla dallanmayı optimize eder.

böyle

Belki bir şey: Biraz arada bir bir talimat sorunu yuvası harcıyoruz beri, bir iç döngü içinde, ama neredeyse kadar değil, özellikle eğer performansınızı azalacak

template<int action> 
__global__ void kernel() 
{ 
    switch(action) { 
     case 1: 
     // First code 
     break; 

     case 2: 
     // Second code 
     break; 
    } 
} 

template void kernel<1>(); 
template void kernel<2>(); 
+3

çok zekice. Bunu sevdim. –

+4

@talonmies ... Bu cevap, SO üzerinde gördüğüm en yararlı şey. Kodumdaki CUDA çekirdekleri sayısı yaklaşık 4 kat azaldı. :) – sgarizvi

+3

Bu, gördüğüm her kodu çirkin görünüyor! –

4

Bir warp ıraksakmış gibi. Bununla birlikte, büyük bir sorunsa, durumun döngü dışında hareket etmesine değer olabilir. çözgü olsa da, gerçekten farklı dallanma kaldırma hakkında düşünmek ise: örneğin yerine

if (i>0) { 
    x = 3; 
} else { 
    x = y; 
} 

ait denemek

x = ((i>0)*3) | ((i<3)*y); 
İlgili konular