如何在PPL中并行化任务数量可变的任务
How to parallelize tasks with variable-number-of-tasks in PPL
我通常习惯于使用OpenMP来并行化任务。然而,当我最近开始做一个新项目时,我想我可能会尝试一下并行模式库。
问题是,我必须将数据存储在列表结构中,在整个过程中,列表结构的大小会有所不同。我可以用OpenMP并行化列表,每次迭代都要创建任务,我尝试用下面的代码来完成同样的事情
#include <list>
#include <ppl.h>
#include <iostream>
#include <Windows.h>
using namespace std;
using namespace Concurrency;
void expo(double x){
double r = 1;
for(int i = 0 ; i<1000000 ; ++i){
r *= x;
}
cout << r << " ";
}
int wmain()
{
int begin,end;
list<int> numbers;
for(int i=1; i<11 ; ++i){
numbers.push_back(i);
}
list<int>::iterator lit;
structured_task_group tasks;
begin = GetTickCount();
for(lit=numbers.begin() ; lit!=numbers.end() ; lit++){
int k = *lit;
auto task1 = make_task([&k](){ expo(k); });
tasks.run(task1);
tasks.wait();
}
end = GetTickCount();
printf("elapsed: %d ms",end - begin);
cin.get();
return 0;
}
但是,正如您所看到的,我必须等待for循环内的任务完成,这意味着要进行串行执行。如果我把"tasks.wait()"放在for循环之后,我会得到一个错误,编译器会说在run命令之后缺少一个wait命令。
我该如何解决这个问题?
顺便问一下,你知道关于PPL的好教程吗?我找到了这个页面(http://msdn.microsoft.com/en-us/library/dd492418.aspx)对于初学者来说,这似乎不是一个完美的教程。
提前感谢!
您可以用以下内容替换structured_task_group
和for()
循环:
parallel_for_each(numbers.begin(), numbers.end(), [](int k){ expo(k); });
相关文章:
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 如何使用 OpenMP 并行化最近邻搜索
- Malloc 在使用线程并行化 SSH 调用时存在问题
- 如何使用 OpenMP 正确并行化 for 循环?
- 如何将矩阵的行随机复制到内存中的另一个矩阵的过程并行化?
- 如何使用 Pthreads 并行化图像翻转?
- MPI:反复并行化缓冲区
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素
- 如何在Visual Studio中并行化armadillo
- 嵌套循环 OpenMP 并行化、私有索引还是公共索引?
- 如何并行化增加循环的大小
- 在 C++ 中使用 OpenMP 并行化两个 for 循环不会提供更好的性能
- OpenMP C++:并行化 for 循环的负载不平衡
- OpenMP 条件并行化 - 并行部分中 if 子句的语法
- C++ 犰狳和OpenMp:外积求和的并行化 - 定义犰狳矩阵的约简
- HPX 是否提供具有粒度控制的基于任务的并行化迭代函数?
- 管道中的任务并行化和数据同步
- 如何在PPL中并行化任务数量可变的任务