2013-07-08 12 views
7

şu doğrultusunda Kısa Versiyon

: aOn0 veya 1 olduğunuişlemciler gerçekte sıfır veya teker çarpma hesaplamak musunuz? Niye ya?

aData[i] = aData[i] + (aOn * sin(i)); 

ise işlemci aslında çarpma işlemini yapar, ya da koşullu diğer sonucu (0 için 0, dışarı çalışır) 1 için -değerinin?

Uzun Versiyon

Ben kısmen Branch Prediction etkisiyle içine bir göz gerektirir algoritma performansı tutarlılık, araştırıyorum.

for (i = 0; i < iNumSamples; i++) 
    aData[i] = aData[i] + (aOn * sin(i)); 

(şube tahmin performansını kararsız) bu kod daha kararlı bir performans sağlayacaktır:

hipotez bu kod aOn ile

for (i = 0; i < iNumSamples; i++) 
{ 
    if (aOn) 
     aData[i] = aData[i] + sin(i); 
} 

0 veya 1 ya olmak ve başka bir iş parçacığı tarafından döngü yürütme sırasında geçiş yapabilirsiniz.

gerçek koşullu hesaplama (yukarıdaki örnekte + sin(i)) daha fazla işleme gerektirir ve durum döngü içinde olması gerekir, (tek bir yukarıdaki örnekte olduğu gibi, koşullar çok sayıda vardır, aynı zamanda, aOn değişiklik olmalı döngü başına hemen değil, etki).

Performans tutarlılığını göz ardı ederek, iki seçenek arasındaki performans değiş tokuşu, if bildirimini ve bir çarpımın yürütülmesi için gereken süredir.

Her ne kadar, bir işlemci, 1 ve 0 gibi değerler için gerçek çoğaltmayı gerçekleştiremezse, ilk seçenek bir kazan-kazan çözümü olabilir (dal tahmini, daha iyi performans).

+0

Bu derleyici bu dışarı optimize olacaktır olasıdır. – iamnotmaynard

+0

Birlikte ve optimizasyon olmadan kontrol etmesini ve 0' 'ait çarpanları arasındaki göreli performansını hiçbir fark,' 1' ve diğer sayılar (optimizasyon olsa tüm durumlar için hafifçe performansını artırmak etmez) yapar. Yani optimizasyon işlemci çarpma yapar olsun veya olmasın ilgilidir tam olarak nasıl? – Izhaki

+0

aon sabit değilse, derleyici dışarı optimize olamaz @iamnotmaynard ama OP olacağına dair herhangi bir belirti yok. –

cevap

6

İşlemciler 0 s ve 1 s ile düzenli çarpma işlemini. Her bir hesaplamadan önce işlemci 0 ve 1'u kontrol ederse, durumun devreye girmesi daha fazla döngü gerektirecektir. Eğer 0 ve 1 çarpanları için performansı kazanabilir ederken, (çok daha muhtemel olduğu) başka değerler için performans kaybeder. Bu kanıtlayabilirim

Basit bir program: çıkışı

#include <iostream> 
#include "cycle.h" 
#include "time.h" 

void Loop(float aCoefficient) 
{ 
    float iSum = 0.0f; 

    clock_t iStart, iEnd; 

    iStart = clock(); 
    for (int i = 0; i < 100000000; i++) 
    { 
     iSum += aCoefficient * rand(); 
    } 
    iEnd = clock(); 
    printf("Coefficient: %f: %li clock ticks\n", aCoefficient, iEnd - iStart); 
} 

int main(int argc, const char * argv[]) 
{ 
    Loop(0.0f); 
    Loop(1.0f); 
    Loop(0.25f); 

    return 0; 
} 

hangi İçin:

Coefficient: 0.000000: 1380620 clock ticks 
Coefficient: 1.000000: 1375345 clock ticks 
Coefficient: 0.250000: 1374483 clock ticks 
+0

Kullanmak vermedi Ne optimizasyon seviyesi ne derleyici ve çıkan 'iSum' bir baskı ile deneyin vermedi - belki kendi içinde bir demet yapar rand()' 'biraz daha az yoğun bir şeyi kullanarak, daha da önemlisi oldukça karmaşık matematik ve sonucu saklanıyor olabilir (ve derleyici rand 'çağırmak için HAS beri()' rand 'beri()' yan etkileri vardır - bu iç durumunu değiştirir), bu ne olursa olsun dikkat optimize edilemez. –

+0

Harika puan. Göreceli performans, optimizasyon seviyesinden bağımsız olarak aynı kalır (hiçbiri '-Os'na değil); Derleyici LLVM C++; rand() 'yazdırma olmadan iSum ', optimizatörün döngüyü tamamen atlamasını önlemek için gereklidir; rand (') olmadan varyasyonları denemek, örneğin' sin (i) 'ile değiştirmek, yine de 3 çarpanın tümü için benzer sonuçlar verir. – Izhaki

+0

Ben derleyici "çarpma değil" içine 0.0 veya 1.0 ön hesaplayan bir senaryo olsun MÜMKÜN olduğunu düşünüyorum, ama derleyici sabit olarak katsayı değerini görebileceğiniz aynı anda, sadece mümkün. Ve işlemcinin türüne bağlı olarak [ve çalışma sırasında değerin öngörülebilirliği - başka bir deyişle, ne sıklıkta değiştiği], bir "if" ile düz bir çoğaltma elde etmek daha iyi olabilir veya olmayabilir. ... devam ediyor ... –

İlgili konular