C++ ve D'de paralellik karşılaştırması yaptığım bir deney. Aynı tasarımı kullanarak her iki dilde de bir algoritmayı (ağlarda topluluk algılaması için paralel etiket yayılma şeması) uyguladım: Bir paralel yineleyici bir tutamaç işlevini (normalde bir kapanır) ve grafikteki her düğüm için uygular. Burada Bu paralel kod neden D ölçeğinde çok kötü?
kullanılarak uygulanan D yineleyici olduğutaskPool
std.parallelism
den:
/**
* Iterate in parallel over all nodes of the graph and call handler (lambda closure).
*/
void parallelForNodes(F)(F handle) {
foreach (node v; taskPool.parallel(std.range.iota(z))) {
// call here
handle(v);
}
}
Bu geçirilir kolu fonksiyonudur:
auto propagateLabels = (node v){
if (active[v] && (G.degree(v) > 0)) {
integer[label] labelCounts;
G.forNeighborsOf(v, (node w) {
label lw = labels[w];
labelCounts[lw] += 1; // add weight of edge {v, w}
});
// get dominant label
label dominant;
integer lcmax = 0;
foreach (label l, integer lc; labelCounts) {
if (lc > lcmax) {
dominant = l;
lcmax = lc;
}
}
if (labels[v] != dominant) { // UPDATE
labels[v] = dominant;
nUpdated += 1; // TODO: atomic update?
G.forNeighborsOf(v, (node u) {
active[u] = 1;
});
} else {
active[v] = 0;
}
}
};
C++ 11 uygulaması hemen hemen aynıdır ancak paralelleştirme için OpenMP kullanır. Peki, ölçekleme denemeleri ne gösteriyor?
Burada da parçacığı sayısını iki katına çıkarır ve çalışma süresi ölçüm sırasında giriş grafik boyutunu iki katına, zayıf ölçekleme inceleyin. İdeal olan doğru bir çizgi olurdu, ama elbette paralellik için bir miktar yük var. D programın iş parçacığı sayısını ayarlamak için ana işlevimde defaultPoolThreads(nThreads)
kullanın. C++ için eğri iyi görünüyor, ancak D için eğri şaşırtıcı derecede kötü görünüyor. Yanlış bir şey yapıyorum w.r.t. D paralellik, ya da bu paralel D programlarının ölçeklenebilirliği üzerinde olumsuz yansıyor mu?
p.s. derleyici bayraklarını D
: C++ için rdmd -release -O -inline -noboundscheck
: -std=c++11 -fopenmp -O3 -DNDEBUG
PPS. Bir şey Ge uygulama sırayla daha paralel yavaştır, çünkü gerçekten yanlış olmalı:
KÖİ'ler. meraklı için burayı Mercurial klon URL'ler hem uygulamaları içindir:
- http://algohub.iti.kit.edu/parco/Prototypes/PLPd
- http://algohub.iti.kit.edu/parco/Prototypes/PLPcpp Ben tam algoritma çalışması gerektiğine anlamıyorum çünkü söylemek zor
Eğer openmp olmadan yapsanız performans nasıl görünür? – greatwolf
Kontrol etmeden, dmd derleyici şu anda openmp özelliğini destekliyor gibi görünmüyor. Bir sürüm openmp kullanıyorsa ve başka bir sürüm kullanmıyorsa, elmaları-elmaları benim için bir karşılaştırma gibi görünmüyor. – greatwolf
@greatwolf Seni yanlış anladığım sürece, noktayı kaçırdığına inanıyorum. D OpenMP'ye sahip değildir, ancak benzer paralel yapılar sağlayan "std.parallelism" kütüphanesine sahiptir. Aslında, D programı çalışırken birçok çekirdek kullanır. – clstaudt