如何使用boost并行化
How can I parallelize a for using boost?
为了优化我正在制作的一些库的执行,我必须并行化一些计算。不幸的是,我不能使用openmp,所以我正在尝试使用boost::thread做一些类似的替代方案。有人知道这样的实现吗?我在线程之间共享变量方面遇到了特殊问题(将变量定义为openmp的"shared"answers"pribate")。有什么建议吗?
据我所知,您必须对OpenMP以外的任何东西显式地执行此操作。
例如,如果我们在OpenMP 中有一个并行循环
int i;
size_t length = 10000;
int someArray[] = new int[length];
#pragma omp parallel private(i)
{
#pragma omp for schedule(dynamic, 8)
for (i = 0; i < length; ++i) {
someArray[i] = i*i;
}
}
您必须将逻辑分解为一个"通用"循环,该循环可以处理问题的子范围,然后显式地调度线程。然后,每个线程将处理整个问题的一大块。通过这种方式,您可以显式地声明"私有"变量,即进入subProblem函数的变量。
void subProblem(int* someArray, size_t startIndex, size_t subLength) {
size_t end = startIndex+subLength;
for (size_t i = startIndex; i < end; ++i) {
someArray[i] = i*i;
}
}
void algorithm() {
size_t i;
size_t length = 10000;
int someArray[] = new int[length];
int numThreads = 4; // how to subdivide
int thread = 0;
// a vector of all threads working on the problem
std::vector<boost::thread> threadVector;
for(thread = 0; thread < numThreads; ++thread) {
// size of subproblem
size_t subLength = length / numThreads;
size_t startIndex = subLength*thread;
// use move semantics to create a thread in the vector
// requires c++11. If you can't use c++11,
// perhaps look at boost::move?
threadVector.emplace(boost::bind(subProblem, someArray, startIndex, subLength));
}
// threads are now working on subproblems
// now go through the thread vector and join with the threads.
// left as an exercise :P
}
以上是许多调度算法中的一种,它只是将问题分割成与线程数量一样多的块。
OpenMP方法更复杂——它将问题分割成许多小的块(在我的示例中为8个),然后使用工作窃取调度将这些块分配给线程池中的线程。实现OpenMP方式的困难在于,您需要等待工作的"持久"线程(线程池)。希望这是有道理的。
一种更简单的方法是在每次迭代中执行异步(为每次迭代安排一项工作)。如果每次迭代都非常昂贵并且需要很长时间,那么这是可行的。然而,如果这是大量迭代的小部分工作,那么大部分开销将用于调度和线程创建,从而使并行化变得毫无用处。
总之,根据您的问题,有许多方法来安排工作,这取决于您找出最适合您的问题的方法。
TL;DR:尝试为您安排的"英特尔线程构建块"(或Microsoft PPL),前提是您提供"子范围"功能:
http://cache-www.intel.com/cd/00/00/30/11/301132_301132.pdf#page=14
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 如何使用 OpenMP 并行化最近邻搜索
- Malloc 在使用线程并行化 SSH 调用时存在问题
- 如何使用 OpenMP 正确并行化 for 循环?
- 如何将矩阵的行随机复制到内存中的另一个矩阵的过程并行化?
- 如何使用 Pthreads 并行化图像翻转?
- MPI:反复并行化缓冲区
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素
- 序列化和反序列化boost共享指针
- 如何在Visual Studio中并行化armadillo
- 嵌套循环 OpenMP 并行化、私有索引还是公共索引?
- 如何并行化增加循环的大小
- 在 C++ 中使用 OpenMP 并行化两个 for 循环不会提供更好的性能
- OpenMP C++:并行化 for 循环的负载不平衡
- OpenMP 条件并行化 - 并行部分中 if 子句的语法
- C++ 犰狳和OpenMp:外积求和的并行化 - 定义犰狳矩阵的约简
- 将 for 循环与嵌套的 while 循环并行化时出现 OpenMP 分段错误
- 如何使用boost并行化