SORU
27 ŞUBAT 2010, CUMARTESİ


Ne zaman, eğer hiç, döngü çözümü hala işe yarıyor mu?

Bazı son derece döngü çözümü ile performans-kritik kod (milyon deniyor hızlı bir sıralama algoritması ve monte carlo simülasyonu içinde milyonlarca kez) optimize etmeye çalışıyorum. İşte hızlandırmak için çalışıyorum iç döngü:

// Search for elements to swap.
while(myArray[  index1] < pivot) {}
while(pivot < myArray[--index2]) {}

Bir şeyin çözümü gibi çalıştım:

while(true) {
    if(myArray[  index1] < pivot) break;
    if(myArray[  index1] < pivot) break;
    // More unrolling
}


while(true) {
    if(pivot < myArray[--index2]) break;
    if(pivot < myArray[--index2]) break;
    // More unrolling
}

Bu daha okunabilir forma değiştirdim hiçbir fark yaptı. Benzer deneyimleri diğer zamanlarda döngü çözümü denedim yaşadım. Modern donanım şube belirleyicileri kalite göz önüne alındığında, ne zaman, eğer hiç, döngü çözümü hala yararlı bir optimizasyon mi?

CEVAP
27 ŞUBAT 2010, CUMARTESİ


Döngü çözümü ise bağımlılık zincirleri kırmak eğer mantıklı. Bu bozuk ya da süper-skaler bir CPU zamanlama her şey daha iyi ve daha hızlı çalışmasını böylece imkanı verir.

Basit bir örnek:

for (int i=0; i<n; i  )
{
  sum  = data[i];
}

Burada bağımsız değişkenlerin bağımlılık zincirinin çok kısa. Eğer veri dizisi üzerinde bir önbellek özledim çünkü bir durak alırsanız cpu olamaz ama bir dakika için her şeyi yapar.

Diğer taraftan bu kod:

for (int i=0; i<n; i =4)
{
  sum1  = data[i 0];
  sum2  = data[i 1];
  sum3  = data[i 2];
  sum4  = data[i 3];
}
sum = sum1   sum2   sum3   sum4;

olabilir daha hızlı çalışır. Eğer bir hesaplama Bayan veya diğer önbellek stall Eğer hala durak bağlı olmayan üç diğer bağımlılık zincirleri vardır. Sipariş İŞLEMCİ bu çalıştırmak için kullanılabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MrMimoB

    MrMimoB

    11 NİSAN 2011
  • Skrillex

    Skrillex

    6 NİSAN 2010
  • stokelycalm

    stokelycalm

    28 Aralık 2010