c – 为什么D中的这个并行代码如此严重?

前端之家收集整理的这篇文章主要介绍了c – 为什么D中的这个并行代码如此严重?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我在C和D中进行比较并行度的一个实验.我使用相同的设计,在两种语言中实现了一种算法(网络中的社区检测的并行标签传播方案):并行迭代器获取句柄函数(通常为闭包)并将其应用于图中的每个节点.

这是D中的迭代器,使用stp.parallelism的taskPool实现:

  1. /**
  2. * Iterate in parallel over all nodes of the graph and call handler (lambda closure).
  3. */
  4. void parallelForNodes(F)(F handle) {
  5. foreach (node v; taskPool.parallel(std.range.iota(z))) {
  6. // call here
  7. handle(v);
  8. }
  9. }

这是传递的handle函数

  1. auto propagateLabels = (node v){
  2. if (active[v] && (G.degree(v) > 0)) {
  3. integer[label] labelCounts;
  4.  
  5. G.forNeighborsOf(v,(node w) {
  6. label lw = labels[w];
  7. labelCounts[lw] += 1; // add weight of edge {v,w}
  8. });
  9.  
  10. // get dominant label
  11. label dominant;
  12. integer lcmax = 0;
  13. foreach (label l,integer lc; labelCounts) {
  14. if (lc > lcmax) {
  15. dominant = l;
  16. lcmax = lc;
  17. }
  18. }
  19.  
  20. if (labels[v] != dominant) { // UPDATE
  21. labels[v] = dominant;
  22. nUpdated += 1; // TODO: atomic update?
  23. G.forNeighborsOf(v,(node u) {
  24. active[u] = 1;
  25. });
  26. } else {
  27. active[v] = 0;
  28. }
  29.  
  30. }
  31. };

C11实现几乎相同,但使用OpenMP进行并行化.那么缩放实验显示什么呢?

在这里我检查弱缩放,使输入图形大小加倍,同时还使线程数量加倍并测量运行时间.理想将是一条直线,但是当然还有一些并行性的开销.我在main函数中使用defaultPoolThreads(nThreads)来设置D程序的线程数. C的曲线看起来不错,但D曲线看起来令人吃惊.我做错了w.r.t. D并行性,或者是否反映了并行D程序的可扩展性?

附:编译器标志

对于D:rdmd -release -O -inline -n​​oboundscheck

对于C:-std = c 11 -fopenmp -O3 -DNDEBUG

PPS.某些事情一定是错误的,因为D的执行速度比顺序慢:

购买力平价.对于好奇,这两个实现都是Mercurial克隆URL:

> http://algohub.iti.kit.edu/parco/Prototypes/PLPd
> http://algohub.iti.kit.edu/parco/Prototypes/PLPcpp

解决方法

很难说,因为我完全不了解算法的运作方式,但是看起来你的代码不是线程安全的,这使得算法运行的迭代次数比必要的多.

我把它添加到PLP.run的末尾:

  1. writeln(nIterations);

有1个线程n = 19
有10个线程nIterations = 34
有100个线程nIterations = 90

所以你可以看到,它不是因为std.parallelism的一些问题需要更长时间,而只是因为它正在做更多的工作.

为什么你的代码不是线程安全的?

并行运行的函数是propagateLabels,它具有对标签的共享,非同步访问权限,nUpdated和active.谁知道这是什么奇怪的行为,但它不可能是好的.

在开始分析之前,您需要将算法修复为线程安全.

猜你在找的C&C++相关文章