线程本地存储:如何组合值?
Thread Local Storage: How to combine values?
我有一个 parallel_for
循环:
tbb::parallel_for(tbb::blocked_range<int>(0, numVerts, 1 /* Grain Size */),
[&](tbb::blocked_range<int> r) {
thread_local vector<int> V;
for (int i = r.begin(); i < r.end(); ++i) {
... (some work changing values in V)
}
}
并且我想在并行工作完成后“组合”这些值,但是如何呢?有办法吗?
根据定义,线程本地存储对于每个线程都是本地的。与任何其他局部变量一样,跨线程访问它的唯一方法是传递指针。
但在这种情况下您不需要这样做(您也不需要 thread_local
)。你知道你需要多少个向量,所以你应该在调用 parallel_for()
之前分配一个向量数组,让 lambda 迭代 blocked_range
根据需要按索引填充每个向量。 parallel_for
完成后,您可以迭代数组以收集结果。
vector<vector<int>> V(numVerts);
tbb::parallel_for(tbb::blocked_range<int>(0, numVerts, 1 /* Grain Size */),
[&](tbb::blocked_range<int> r) {
for (int i = r.begin(); i < r.end(); ++i) {
// some work changing values in V[i] ...
}
}
);
// use V as needed...
我有一个 parallel_for
循环:
tbb::parallel_for(tbb::blocked_range<int>(0, numVerts, 1 /* Grain Size */),
[&](tbb::blocked_range<int> r) {
thread_local vector<int> V;
for (int i = r.begin(); i < r.end(); ++i) {
... (some work changing values in V)
}
}
并且我想在并行工作完成后“组合”这些值,但是如何呢?有办法吗?
根据定义,线程本地存储对于每个线程都是本地的。与任何其他局部变量一样,跨线程访问它的唯一方法是传递指针。
但在这种情况下您不需要这样做(您也不需要 thread_local
)。你知道你需要多少个向量,所以你应该在调用 parallel_for()
之前分配一个向量数组,让 lambda 迭代 blocked_range
根据需要按索引填充每个向量。 parallel_for
完成后,您可以迭代数组以收集结果。
vector<vector<int>> V(numVerts);
tbb::parallel_for(tbb::blocked_range<int>(0, numVerts, 1 /* Grain Size */),
[&](tbb::blocked_range<int> r) {
for (int i = r.begin(); i < r.end(); ++i) {
// some work changing values in V[i] ...
}
}
);
// use V as needed...