Aşağıdaki C++ kod snippet'ini (C++ kısmı, burada atlanan profiler sınıfıdır), VS2010 (64bit Intel makinesi) ile derlenmiştir. Kod basitçe bir sayısal ile yüzen (arr2
) bir dizi çarpar ve başka dizide (arr1
) içine sonucunu koyar:Performans, temel veri değerlerine bağlıdır.
int M = 150, N = 150;
int niter = 20000; // do many iterations to have a significant run-time
float *arr1 = (float *)calloc (M*N, sizeof(float));
float *arr2 = (float *)calloc (M*N, sizeof(float));
// Read data from file into arr2
float scale = float(6.6e-14);
// START_PROFILING
for (int iter = 0; iter < niter; ++iter) {
for (int n = 0; n < M*N; ++n) {
arr1[n] += scale * arr2[n];
}
}
// END_PROFILING
free(arr1);
free(arr2);
okuma-dan-dosyanın parçası ve profil (yani çalışma zamanı ölçümü) 'dir basitlik için burada ihmal edildi. arr2
aralığında rasgele sayılar için başlatılır
[0 1], kod yaklaşık 10 kat daha hızlı arr2
değerlerin yaklaşık 2/3 sıfır olduğu bir seyrek dizisine başlatılan bir durum ile karşılaştırıldığında çalışır . Çalışma süresini biraz değiştiren /fp
ve /O
derleyici seçenekleri ile oynadım, ancak yaklaşık 1:10 oranı tutuldu.
- Performans, gerçek değerlere nasıl bağlıdır? CPU ne farklı yapar, bu seyrek veriyi ~ 10 kat daha yavaş çalıştırır?
- "Yavaş veri" nin daha hızlı çalışmasını sağlamanın bir yolu var mı yoksa herhangi bir eniyileme (örneğin, hesaplamanın vektör edilmesi) her iki dizide de aynı etkiye sahip olacak (yani "yavaş veri" daha yavaş çalışacak "hızlı" veri")?
DÜZENLEME
Komple kod buradadır: https://gist.github.com/1676742, derleme için komut satırı test.cpp
bir açıklama yer almaktadır.
veri dosyaları
burada şunlardır: "hızlı" veriler sadece normal bir kayan nokta sayıdan oluşur, ancak sizin "yavaş" çünkü
İki testin eksiksiz, tamamlanabilir sürümlerini sunabilir miyiz? – NPE
Seyrek matrisinizdeki floatınıza '0' ilettiğinizde, int 'den' float 'dönüşümü bazı ek yükleri tanıtır mı? –
Yalnızca 0 olmayan öğeleri mi güncellersiniz? Yani, sıfırlar önbellekte olmayabilir mi? – duedl0r