我打算使用缓冲区std :: vector< size_t>缓冲区(100),在循环并行化的每个线程中有一个,如此代码所示:
std::vector<size_t> buffer(100);
#pragma omp parallel for private(buffer)
for(size_t j = 0; j < 10000; ++j) {
// ... code using the buffer ...
}
此代码不起作用.虽然每个线程都有一个缓冲区,但它们的大小为0.
如何在每个线程的开头分配缓冲区?我还可以使用#pragma omp parallel吗?我可以比这更优雅地做到这一点:
std::vector<size_t> buffer;
#pragma omp parallel for private(buffer)
for(size_t j = 0; j < 10000; ++j) {
if(buffer.size() != 100) {
#pragma omp critical
buffer.resize(100);
}
// ... code using the buffer ...
}
解决方法
拆分OpenMP区域,如
this question所示.
然后在外部区域内声明向量,但在for循环本身之外.这将为每个线程创建一个本地向量.
#pragma omp parallel
{
std::vector<size_t> buffer(100);
#pragma omp for
for(size_t j = 0; j < 10000; ++j) {
{
// ... code using the buffer ...
}
}