C kodu döngü performans [devamı]
Bu soru benim sorum burada (Mistik tavsiyesi üzerine) devam ediyor:
Skaler talimatları yerine paketlenmiş talimatları kullandığımda benim sorum devam edersek, kodu ön tanımlı kullanarak çok benzer görünecektir:
for(int i=0; i<size; i =16) {
y1 = _mm_load_ps(output[i]);
…
y4 = _mm_load_ps(output[i 12]);
for(k=0; k<ksize; k ){
for(l=0; l<ksize; l ){
w = _mm_set_ps1(weight[i k l]);
x1 = _mm_load_ps(input[i k l]);
y1 = _mm_add_ps(y1,_mm_mul_ps(w,x1));
…
x4 = _mm_load_ps(input[i k l 12]);
y4 = _mm_add_ps(y4,_mm_mul_ps(w,x4));
}
}
_mm_store_ps(&output[i],y1);
…
_mm_store_ps(&output[i 12],y4);
}
Ölçülen performans bu çekirdek yaklaşık 5.6 FP işlemleri, döngü, her ne kadar beklediğiniz için tam olarak 4x performans skaler sürümü, yani 4.1,6=6,4 FP ops başına döngüsü.
Dikkate ağırlık faktörü (buna dikkat çektiğin için teşekkürler) taşı alarak, zamanlama gibi görünüyor:
Görünüşe göre programı değiştirmez olmasına rağmen, fazladan bir talimat sonra movss
çalışma gider skaler ağırlık değeri XMM kayıt ve daha sonra kullanır shufps
kopyalama bu skaler değeri tüm vektör. Göründüğü gibi kilo vektör hazır olmak için mulps
zaman geçiş gecikmesi yüklemek için kayan nokta etki alanı hesabı, yani bu olmamalı tabi ekstra bir gecikme.
movaps
(uyumlu, paketlenmiş hareket),addps
& mulps
talimatları kullanılan bu çekirdek (kontrol ile derleme kod) aynı gecikme süresi ve işlem hacmi olarak skaler sürümleri, yani bu olmamalı tabi ekstra bir gecikme ya.
Var mı bir fikrin bu ekstra döngü başına 8 devir geçirdi, varsayarak maksimum performans bu çekirdek alabilirsiniz. 6.4 FP ops başına döngüsü ve çalışan 5.6 FP ops başına döngüsü?
Gerçek montaj gibi görünüyor buraya kadar.
…
Block x:
movapsx (%rax,%rcx,4), %xmm0
movapsx 0x10(%rax,%rcx,4), %xmm1
movapsx 0x20(%rax,%rcx,4), %xmm2
movapsx 0x30(%rax,%rcx,4), %xmm3
movssl (%rdx,%rcx,4), %xmm4
inc %rcx
shufps $0x0, %xmm4, %xmm4 {fill weight vector}
cmp $0x32, %rcx
mulps %xmm4, %xmm0
mulps %xmm4, %xmm1
mulps %xmm4, %xmm2
mulps %xmm3, %xmm4
addps %xmm0, %xmm5
addps %xmm1, %xmm6
addps %xmm2, %xmm7
addps %xmm4, %xmm8
jl 0x401ad6 <Block x>
…
CEVAP
Vtune veya oprof gibi bazı eşdeğer aracında EMON profil kullanmayı deneyin
- 11* *(Windows sürümü için arama yapabilirsiniz)
- oprofile
EMON (Olay Takibi) = ^ profil oluşturma . bir zaman tabanlı araç gibi, ama performans olayı soruna neden olduğunu anlarsınız. Bir süre önce profil tabanlı ile işe başlamak gerekir, Ancak Eğer dışarı atlar belirli bir talimat olup olmadığını görmek için. (Ve muhtemelen ilgili olaylar o IP emeklilik oyalandım.)
EMON profil, olayların listesi ile çalıştırmalısınız, değişen kullanım için "olağan şüpheliler"
Burada, önbellek özlüyor kapalı, hizalama başlamak istiyorum. Bilmiyorum eğer işlemciyi kullanarak bir sayaç için RF port kısıtlamaları gerekir - ama ekledim EMON profilleme uzun zaman önce, ve bilmiyorum ne kadar iyi olduklarını uydurarak ekleyerek olayları uygun için uygundur.
Ayrıca ön uç, oyala talimatı getirmek olduğunu mümkün olabilir. Kaç bayt bu yönergeler, her neyse. Bunun için EMON olaylar da var.
VTune Die L3 olayları görmüyor bu yorum yanıt: doğru değil. Burada yorum ekleyerek, ama uymayan şeyler:
Aslında, / L3$ / LL3 sözde Uncore için performans sayaçları VARDIR. Eğer VTune onları desteklemez. eğer çok şaşırırım. PTU gibi VTune ve diğer araçlar için http://software.intel.com/sites/products/collateral/hpc/vtune/performance_analysis_guide.pdf puan bakın. Hatta LL3 olaylar olmadan aslında, David Levinthal diyor: "Intel® Core™ i7 işlemci bir “olay” olan gecikme süresi vardır çok benzer Alınmıyor® İşlemci Ailesi Veri KULAK olayı. Bu olay örnekleri yükler, talimatın yerine getirilmesi ve gerçek arasındaki devir sayısı kaydı veri sunun. Eğer ölçülen gecikme süresi minimum gecikme büyükse 0x3f6, 15:0, tezgaha bit MSR programlanmış artırılır. Sayaç bir sonraki olay gecikme tatmin edici taşma silah PEBS mekanizması ve eşik, ölçülen gecikme, sanal ya da doğrusal adres ve veri kaynağı PEBS tampon 3 ek kayıtları kopyalar. Sanal adres olduğundan bilinen bir konum içine çekilen, örnekleme sürücü de bir sanal yürütebilir fiziksel çeviri ve fiziksel adresini yakalayın. Fiziksel adresini tanımlar Ve prensipte NUMA ev konumu önbellek ayrıntıları analiz sağlar occupancies." Ayrıca, sayfa CACHE_HİT_UNCORE_HİT L3 ve L3 CACHE_MİSS_REMOTE_DRAM gibi olaylar VTune 35, on puan. Bazen sayısal kodları Ara ve VTune daha düşük seviyeli bir arayüz içine programı gerekir, ama bu durumda oldukça kullanıcı arabirimi görünür olduğunu düşünüyorum.
TAMAM, http://software.intel.com/en-us/forums/showthread.php?t=77700&o=d&s=lr Rusya'da VTune bir programcı (sanırım)" Uncore olaylara örnek olamaz. "diye açıklıyor
Haksızsa, örneğin, tek bir CPU, örnek ve anlamlı bir şekilde yapılmasını sağlayabilirsiniz. Ben de CPU döndüğünde L3 eksik veri işaretlemek için yeteneği olduğuna inanıyorum. Aslında, genel L3 kesinlikle örnek böylece veri dönmeden hangisi olduğunu bilir. Hangi hyperthread bilmiyor olabilirsiniz, ama yine, tek iş parçacığı devre dışı moduna gidebilirsiniz.
Ama, oldukça yaygın olarak, VTune ETRAFINDA değil, iş için, bunu yapmak zorunda olacak gibi görünüyor.
Gecikme profilleme ilk deneyin. Bu tamamen CPU içinde ve VTune Millet çok berbat değildir.
Ve yine ihtimal senin sorunun özünde ise, L3 derim. VTune bunun üstesinden bne.
"Levinthal başına. "Döngüsü Muhasebe deneyin
64-bit ile 32-bit döngü sayısı bir değ...
Bu iki döngü için zaman ve önbellek pe...
Döngü için bir Ve için-her döngü arası...
Yüksek performans profilleme Haskell k...
Java için döngü vs Yineleyici/dosyalar...