ait çalışma zamanı içinde büyük bir değişkenlik neden, ama burada gider edebilirsiniz. Birdenbire büyük bir performans düşüşü gördük. Neler olduğunu test etmek için yazılımı aynı girişte birden çok kez çalıştırdık. Sonuçlar (büyük performans değişkenlik) şaşırtıcı edildi:... ne ben stackoverflow iyi forumu olup olmadığından emin değilim bir çok iş parçacıklı kod
Solution time = 9.69 sec.
Solution time = 7.55 sec.
Solution time = 4.78 sec.
Solution time = 5.12 sec.
Solution time = 6.94 sec.
Solution time = 2.15 sec.
Solution time = 5.48 sec.
Bizim yazılım okuyuculu, başlar tam olarak bir iplik, her çekirdek üzerine (hiper iş devre dışı bırakılır), bir 12-çekirdek makinesinin. Makinede başka bir şey yok. Hafta sonundan önce çalışma zamanında hiç bir çeşitliliğe sahip olmadık. Bir kapris üzerinde
biz CPU ile bir test tekrar bağlama etkin (yani, farklı bir çekirdeğe 12 ipliklerinin her pin): Bu neden olabilir ne herhangi bir fikir sahibi Bu noktadaSolution time = 0.95 sec.
Solution time = 0.95 sec.
Solution time = 0.95 sec.
Solution time = 0.95 sec.
Solution time = 0.94 sec.
Solution time = 0.95 sec.
Solution time = 0.95 sec.
. Bildiğimiz kadarıyla makinenin konfigürasyonunda hiçbir şey değişmedi (RHEL 6.6). Geçmişte olmayan bağlı kod sergi varyasyon yaptı:
Hemen tekrar vurgulamak: Ben --Laci
DÜZENLEME ...
sayesinde herhangi bir öneri için minnettar olurum fakat en fazla% 10-15 seviyesinde idi ve ortalama olarak cpu-bağlı koda çok yakındı (% 1-2 içinde). Son haftasonundan beri bu değişimi görmeye başladık ve farkında olduğumuz kadarıyla çevrede hiçbir şey değişmedi. Ama (belli ki) bir şey değişmiş olmalı ve ne olabileceğini merak ediyorum.
EDIT2
:I (10 kez tekrarlanarak) perf aracılığıyla kod koştum ve bu bende ne olduğunu. CPU bağlayıcı ile
:
15713.138442 task-clock-msecs # 9.341 CPUs (+- 0.037%)
6958 context-switches # 0.000 M/sec (+- 0.357%)
11 CPU-migrations # 0.000 M/sec (+- 1.786%)
49147 page-faults # 0.003 M/sec (+- 0.514%)
45890046261 cycles # 2920.489 M/sec (+- 0.030%)
51929307378 instructions # 1.132 IPC (+- 0.021%)
11050565282 branches # 703.269 M/sec (+- 0.032%)
446256370 branch-misses # 4.038 % (+- 0.003%)
421789915 cache-references # 26.843 M/sec (+- 0.048%)
18989944 cache-misses # 1.209 M/sec (+- 0.305%)
1.682190890 seconds time elapsed (+- 0.131%)
işlemci bağlayıcı olmadan: Kod deterministik olduğu
36219.945761 task-clock-msecs # 5.677 CPUs (+- 3.978%)
8742 context-switches # 0.000 M/sec (+- 1.677%)
34 CPU-migrations # 0.000 M/sec (+- 5.243%)
48799 page-faults # 0.001 M/sec (+- 0.839%)
106384797638 cycles # 2937.188 M/sec (+- 3.989%)
93465235493 instructions # 0.879 IPC (+- 3.085%)
23685574664 branches # 653.937 M/sec (+- 3.672%)
477076300 branch-misses # 2.014 % (+- 0.563%)
414008416 cache-references # 11.430 M/sec (+- 0.189%)
17910783 cache-misses # 0.495 M/sec (+- 1.468%)
6.380128466 seconds time elapsed (+- 5.171%)
Not, yani, her zaman aynı uygulama yolu alır. Ancak, bir iş parçacığının küresel deterministik bir durumla senkronize olma sırasını beklemekle meşgul olması mümkündür. Ama neden döngü/yönerge/etc gibi büyük bir farka neden olur? ...
Ayrıca, bunları çekirdeklerin içine çeken hipotezleri test etmek için iş parçacıklarını rasgele sırayla çekirdeklere sabitlemeye çalıştığımı unutmayın. Yaratılışlarının sırası bir fark yaratıyor. Ama bu hiç farketmedi, hala hızlıydı.
Zaman farkı dramatik olsa da, veri lokalitesinin çok önemli olduğunu ve çekirdekler arası iş parçacığı göçünün buna neden olan şey olduğunu sanıyorum. Algoritmanızın CPU'daki L1 ve L2 önbelleklerini maksimum düzeyde kullanıp kullanmadığını merak edemiyorum. Bu algoritmanın ne yaptığı konusunda biraz bilgi verebilir misiniz? – ekarak
Ayrıca, kodunuzun reentrant olduğundan emin misiniz? Herhangi bir muteks, güncellenmesi gereken herhangi bir ortak yapı var mı? – ekarak
Karma bir tamsayılı programlama çözücüdür. Ve evet, önbellek mevcudiyeti çok önemli (maalesef sadece% 90'lık önbellek vurma oranı elde ediyoruz) ve bunun iyileştirilmesi mümkün görünmüyor. Son haftasonuna kadar, bağlı olmayan ve cpu-bağlı kod arasındaki fark% 1-2 idi ve bağlı olmayan kodda gözlemlediğimiz maksimum varyasyon ~% 10-15 idi. Sonuçta, makine yüklü değil, çekirdeğin konuları sıkça geçirecek bir nedeni yok. Ve evet, kod yeniden giriyor ve helgrind doğru olduğunu söyleyebilir. – LaszloLadanyi