【发布时间】:2019-09-02 06:04:10
【问题描述】:
我正在编写一个将组合生成为布尔向量形式的并行程序。由于组合是使用线程生成的,因此我会在每个线程完成其工作时将它们组合起来。
set<vector<bool>> Ci[T.size()];
//generate combinations in parallel and thread i add result in Ci[i]
start_time = omp_get_wtime();
set<vector<bool>> C;
for(int i=0;i<T.size();i++){
cout << "i=" << i << "\t" << Ci[i].size() << endl;
C.insert(Ci[i].begin(),Ci[i].end());//here combine them into a single set
}
end_time = omp_get_wtime();
total_time = end_time - start_time;
cout << " Total time:" <<total_time << endl;
cout << C.size();
线程总数,T.size() 会有所不同,但总组合(C 的大小)始终相同。 例如,
Enter threads:10
i=0 1
i=1 144
i=2 4320
i=3 47040
i=4 229320
i=5 550368
i=6 672672
i=7 411840
i=8 115830
i=9 11440
Total time:36.641s
C's size :2042975
Enter threads:128
i=0 9
i=1 45
i=2 165
...
i=120 10
i=121 11
i=122 12
i=123 13
i=124 14
i=125 15
i=126 16
i=127 18
Total time:6.432s
C's size :2042975
我不明白的是在这两种情况下,我在 C 中插入了相同数量的组合。为什么花费的时间不一样?
【问题讨论】:
-
大小不一样...当我从
0...9运行时似乎还有很多工作虽然最后的大小是相同的,所以也许插入更小的块更快.也许this 可以帮忙? -
大小相同...我只是省略了从 i=3 到 i=119 的值。例如,当 i=12 203490 时,i=15 477445。只是这些值分布不均。
-
我也是这么想的。因此,我使用不同的 C 大小和线程数进行测试。如果线程数为 126,则 C 大小为 53130 -> 总时间为 0.667 秒。如果线程数为 80 -> 总时间为 0.148 秒。在这种情况下,情况正好相反。
-
您正在插入很多已经按顺序排列的元素。也许它会触发一些边缘情况,因为底层结构(RB-tree)需要做更多的工作来保持树的平衡。如果您的线程较少,那么已经有序的元素数量会更多,这就是您获得较低性能的原因。这只是猜测,但对我来说似乎是一个明智的解释。只是为了好玩,您可以尝试先将所有元素放入一个向量中,然后将其洗牌,然后将其放入集合中。
-
@nielsen 这可能是因为这些元素之间的分布方式不同。如果你想测试,ideone.com/TRWvuk -> 对于这个程序,输入 is(25 9 10) 这意味着从 25 个对象中选择 9 个对象并在 10 个线程上运行。合并结果发生在第 44 到 49 行。ideone.com/RT4ROR -> 对于这个程序,输入是(25 9 128),这意味着从 25 个对象中选择 9 个对象并在 128 个线程上运行。合并结果发生在第 79 到 85 行。
标签: c++ data-structures insert set