Commit 50b9e653 by 10382

🆚 Add Homework Codes!

parent af1e5d47
......@@ -129,10 +129,16 @@ int paraSumRed() {
考虑一下前面提到的规约操作的两件事情,为了简化理解,我重新设置了 OpenMP 并行线程数 `OMP_NUM_THREADS` 为 2 (之前为4),并对规约后的过程进行输出,可以发现都是 0,1,3,3,7 的组合,可见规约后的计算过程如下,
![image-20201030214216195](/Users/fc10382/Library/Application Support/typora-user-images/image-20201030214216195.png)
![规约后的双线程计算流程](https://pic.rmb.bdstatic.com/bjh/10de0e567bb7b86b94ece09dffa461fd.png)
确实是规约操作的思想,采用reduction之后,每个线程根据 `reduction(+: sum)` 的声明算出自己的 `sum`,然后再将每个线程的`sum` 加起来。
## 总结
规约操作通过将原始任务划分为多个子任务,并将子任务的结果合并以实现多线程下的并行计算,减少计算时间,避免并发一致性的问题。
## 附录
代码:
- [for.cpp](./for.cpp)
\ No newline at end of file
#include <iostream>
#include <omp.h> // OpenMP编程需要包含的头文件
int paraSum() {
int sum = 0;
#pragma omp parallel for
for (int i = 0; i < 5; ++i) {
sum = sum + i;
}
return sum;
}
int paraSumRed() {
int sum = 0;
// std::cout << "Before: " << sum << std::endl;
#pragma omp parallel for reduction(+:sum)
for (int i = 0; i < 5; ++i) {
sum = sum + i;
// std::cout << sum << std::endl;
}
// std::cout << "After: " << sum << std::endl;
return sum;
}
int paraSumRedIO() {
int sum = 0;
std::cout << "Before: " << sum << std::endl;
#pragma omp parallel for reduction(+:sum)
for (int i = 0; i < 5; ++i) {
sum = sum + i;
std::cout << sum << std::endl;
}
std::cout << "After: " << sum << std::endl;
return sum;
}
int main() {
// int clicks = 1000000;
// int count = 0;
// for (int z = 0; z < clicks; z++) {
// //int sum = paraSum();
// int sum = paraSumRed();
// if (sum == 10)
// count++;
// }
// std::cout<<(double)count/clicks<<std::endl;
paraSumRedIO();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment