并行推回向量的向量
Parallel push back to a vector of vector
我有一个向量的向量。我以并行方式构造此向量,向量中的每个索引都由单个线程处理。类似于此:
vector<vector<int> > global_vec(10, vector<int>({}));
#pragma omp parallel for schedule(dynamic)
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < i * 5; j++)
{
global_vec[i].push_back(i);
}
}
我知道如果我事先知道每个向量的大小,我可以在开始时分配所需的大小,然后就不会有问题了。但这不是我能做到的,我需要动态地推回去。这个线程安全吗?
提前致谢。
是的,这是 thread-safe,因为内部向量仅由一个线程修改。您可以省略 schedule(dynamic)
导数并仍然保存。
如果使用 std::iota
.
摆脱内部循环,这会变得更清晰一些
vector<vector<int> > global_vec(10, vector<int>({}));
#pragma omp parallel for schedule(dynamic)
for(int i = 0; i < 10; i++)
{
global_vec[i].resize(i * 5) ;
std::iota(global_vec[i].begin(), global_vec[i].end(), 0);
}
Ps。如果您的外部向量具有固定大小,请考虑改用 std::array<vector<int>, 10>
。
我有一个向量的向量。我以并行方式构造此向量,向量中的每个索引都由单个线程处理。类似于此:
vector<vector<int> > global_vec(10, vector<int>({}));
#pragma omp parallel for schedule(dynamic)
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < i * 5; j++)
{
global_vec[i].push_back(i);
}
}
我知道如果我事先知道每个向量的大小,我可以在开始时分配所需的大小,然后就不会有问题了。但这不是我能做到的,我需要动态地推回去。这个线程安全吗?
提前致谢。
是的,这是 thread-safe,因为内部向量仅由一个线程修改。您可以省略 schedule(dynamic)
导数并仍然保存。
如果使用 std::iota
.
vector<vector<int> > global_vec(10, vector<int>({}));
#pragma omp parallel for schedule(dynamic)
for(int i = 0; i < 10; i++)
{
global_vec[i].resize(i * 5) ;
std::iota(global_vec[i].begin(), global_vec[i].end(), 0);
}
Ps。如果您的外部向量具有固定大小,请考虑改用 std::array<vector<int>, 10>
。