Skip to content
This repository was archived by the owner on Jan 27, 2021. It is now read-only.

Commit 999e8a4

Browse files
author
Chen Xiaowei
committed
1. update 9-11
1 parent 521af39 commit 999e8a4

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

content/chapter9/chapter9-11-chinese.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@
107107
7. `accumulate`不会在对第二个参数中`size_t`的值进行打印,不过这次改成了`future<size_t>`。我们需要花点时间对这个类型进行适应(对于一些初学者来说,这里使用`auto&`类型的话可能会让其产生疑惑),之后需要调用`x.get()`来访问`x`中的值,如果`x`中的值还没计算出来,程序将会阻塞进行等待:
108108
109109
```c++
110-
auto binfunc ([w, n{0}] (auto output_it, future<size_t> &x
110+
auto binfunc ([w, n{0}] (auto output_it, future<size_t> &x)
111111
mutable {
112112
*++output_it = (x.get() > 50 ? '*' : ' ');
113113
if (++n % w == 0) { ++output_it = '\n'; }
@@ -135,7 +135,7 @@ transform(begin(v), end(v), begin(r), to_iteration_count);
135135
136136
唯一可能并行化的部分就是从`begin(v)`到`end(v)`的处理,每块都具有相同尺寸,并能够分布在所有核上。这样所有核将会对输入数据进行共享。如果使用并行版本的`std::transform`,就需要带上一个执行策略。不幸的是,这不是问题的正确解决方式,因为每一个曼德尔布罗特集合中的点,迭代的次数是不同的。
137137
138-
我们的方式是使用一个`vector`收集将要获取每个点所要计算的数量的`future`变量。代码中`vector`能容纳`w * h`个元素,例子中就是`100 * 40`,也就是说`vector`实例中存储了4000个`future变量`,这些变量都会在异步计算中得到属于自己的值。如果我们的系统有4000个CPU核,就可以启动4000个并发的对坐标进行迭代计算。一个常见的机器上并没有那么多核,CPU只能是异步的对于一个元素进行处理,处理完成后再继续下一个。
138+
我们的方式是使用一个`vector`收集将要获取每个点所要计算的数量的`future`变量。代码中`vector`能容纳`w * h`个元素,例子中就是`100 * 40`,也就是说`vector`实例中存储了4000个`future`变量,这些变量都会在异步计算中得到属于自己的值。如果我们的系统有4000个CPU核,就可以启动4000个并发的对坐标进行迭代计算。一个常见的机器上并没有那么多核,CPU只能是异步的对于一个元素进行处理,处理完成后再继续下一个。
139139
140140
`to_iteration_count`中调用异步版本的`transform`时,并不是去计算,而是对线程进行部署,然后立即获得对应的`future`对象。原始版本会在每个点上阻塞很久,因为迭代需要花费很长时间。
141141

0 commit comments

Comments
 (0)