为什么这个代码在与std :: sort()完全正常工作时不会并行化std :: for_each()?
我该如何解决?
g++ -fopenmp -D_GLIBCXX_PARALLEL=1 -o p p.cc && time ./p sort
Linux上的GCC 4.3。
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
void delay()
{
for(int c = 0; c < 1000000; c++) {
}
}
int lt(int a, int b)
{
delay();
return a < b;
}
void noop(int a)
{
delay();
}
int main(int argc, char **argv)
{
if (argc < 2) {
printf("%s <sort | for_each>\n", argv[0]);
return 1;
}
std::vector<int> foo(10000);
if (!strcmp(argv[1], "sort")) {
std::sort(foo.begin(), foo.end(), lt);
} else if (!strcmp(argv[1], "for_each")) {
std::for_each(foo.begin(), foo.end(), noop);
}
}
答案 0 :(得分:6)
仅使用-D_GLIBCXX_PARALLEL
进行编译并不一定会并行化所有算法(请参阅here):
请注意,这并不一定意味着所有内容最终都会以并行方式执行,而是编码到并行版本中的启发式和设置将用于确定是否所有,部分或无算法使用并行变体执行。
但是Configuration and tuning章节可能会帮助您强制并行化。
只需记下您的“基准”:
std::sort
和std::for_each
不一定会将delay()
调用相同的次数。 std::for_each
调用延迟方法N
次,std::sort
调用N log(N)
和N^2
次之间的延迟方法(请参阅reference)。因此,测量执行时间只能给出关于并行化的弱指示。