2016-04-09 19 views
-2

Merhaba Bana bir şeyin "bir sonraki" değerini vermesi gereken bir işlevi optimize etme yolundayım. Şu ana kadar ne varFonksiyonu hızlandırmak için aritmetiğe dönüş döngü

int fun(int a){ 
    const int k = ...; 
    for(;test_value(a++) != k;); 
    return a; 
    } 

Bu değil derleyici if (benim algoritma aslında çalıştı ama şimdi sonradan ben döngü her değişiklikte dallanma için bir test yapar korkuyorum test etmek için hızlı ve kirli bir yol olduğunu olduğunu sahnelerin arkasında ele almak çok iyi?). Sınamayı yerine getirme şansının en fazla 1/5 ve en kötü durumların bir milyonda bir olması olasılığını söyleyelim, ancak bu test_value sadece bir saat döngüsü veya ikidir. CPU boru hatlarını daha iyi kullanmak için derleyicimin tüm dalları aritmetik ile ticaretine yardımcı olabilmem için sistematik bir yol var mı?

+0

Bunun sadece test_value'nin ne olduğuna bağlı olacağını düşünmüyor musunuz? –

+0

Bu, herhangi bir dallanma riski olmadan sadece birkaç döngü içinde yürütmesi gereken bir işlevdir. Muhtemelen modern makinelerde SSE talimatı olarak mevcuttur. – mathreadler

cevap

1

Sen "göz önüne sermek" olabilir sizin döngü biraz şey gibi:

int nomatch = 1; 
while(nomatch){ 
    nomatch = (test_value(a++) != k); 
    nomatch &&= (test_value(a++) != k); 
    nomatch &&= (test_value(a++) != k); 
    nomatch &&= (test_value(a++) != k); 
    nomatch &&= (test_value(a++) != k); 
} 

Bu az yinelemeleri doğuracak, ve bir eşleşme bulunduktan sonra kısa devre test_value değerlendirmelerini engelleyecektir.

Orijinal kodunuz gibi, bu, bir noktada bir eşleşme bulunacağını varsayar.

+0

Harika bir fikir, bir çözüm bulmama yardımcı oldu. – mathreadler

İlgili konular