gpt4 book ai didi

C++0x 线程没有加速

转载 作者:可可西里 更新时间:2023-11-01 17:16:27 27 4
gpt4 key购买 nike

我已经编写了一个程序,用于使用 c++0x 线程搜索数组中的最大值(用于学习目的)。对于实现,我使用了标准的 threadfuture 类。然而,并行化函数不断显示与非并行化相同或更差的运行时间。

代码如下。我尝试将数据存储在一维数组、多维数组中,最后得到了几个数组。然而,没有一个选项给出了好的结果。我尝试从 Eclipse 和命令行编译并运行我的代码,但仍然没有成功。我也尝试了没有使用数组的类似测试。并行化只给了 20% 的速度。从我的角度来看,我运行的是非常简单的并行程序,没有锁,几乎没有资源共享(每个线程都在自己的数组上运行)。什么是瓶颈?

我的机器配备 Intel Core i7 处理器 2.2 GHz 和 8 GB 内存,运行 Ubuntu 12.04。

const int n = 100000000;

int a[n], b[n], c[n], d[n];

int find_max_usual() {
int res = 0;
for (int i = 0; i < n; ++i) {
res = max(res, a[i]);
res = max(res, b[i]);
res = max(res, c[i]);
res = max(res, d[i]);
}
return res;
}

int find_max(int *a) {
int res = 0;
for (int i = 0; i < n; ++i)
res = max(res, a[i]);
return res;
}

int find_max_parallel() {
future<int> res_a = async(launch::async, find_max, a);
future<int> res_b = async(launch::async, find_max, b);
future<int> res_c = async(launch::async, find_max, c);
future<int> res_d = async(launch::async, find_max, d);
int res = max(max(res_a.get(), res_b.get()), max(res_c.get(), res_d.get()));
return res;
}

double get_time() {
timeval tim;
gettimeofday(&tim, NULL);
double t = tim.tv_sec + (tim.tv_usec / 1000000.0);
return t;
}

int main() {
for (int i = 0; i < n; ++i) {
a[i] = rand();
b[i] = rand();
c[i] = rand();
d[i] = rand();
}
double start = get_time();
int x = find_max_usual();
cerr << x << " " << get_time() - start << endl;
start = get_time();
x = find_max_parallel();
cerr << x << " " << get_time() - start << endl;
return 0;
}

时序显示find_max_parralel中几乎所有的时间都被

消耗了
int res = max(max(res_a.get(), res_b.get()), max(res_c.get(), res_d.get()));

编译命令行

g++ -O3 -std=c++0x -pthread x.cpp

更新。 问题已解决。我用同样的测试得到了想要的结果。 4 个线程提供大约 3.3 的加速,3 个线程提供大约 2.5 的加速,2 个线程表现几乎理想,1.9 的加速。我刚刚用一些新的更新重新启动了系统。我没有看到 cpu 负载和运行 porgrams 有任何显着差异。

感谢大家的帮助。

最佳答案

您必须显式设置 std::launch::async

future<int> res_c = async(std::launch::async, find_max, c);

如果省略标志 std::launch::async | std::launch::deferred 是假设,它让实现来选择是异步启动任务还是延迟启动任务。

当前版本的 gcc 使用 std::launch::deferred,MSVC 有一个运行时调度程序,它在运行时决定任务应该如何运行。

另请注意,如果您想尝试:

std::async(find_max, c);

这也会阻塞,因为 std::future 的析构函数等待任务完成。

关于C++0x 线程没有加速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13647958/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com