【发布时间】:2015-04-13 16:30:16
【问题描述】:
假设我们有两个嵌套循环。内循环应该是并行的,但是外循环需要顺序执行。然后下面的代码做我们想做的事:
for (int i = 0; i < N; ++i) {
#pragma omp parallel for schedule(static)
for (int j = first(i); j < last(i); ++j) {
// Do some work
}
}
现在假设每个线程都必须获取一些线程本地对象来执行内部循环中的工作,并且获取这些线程本地对象的成本很高。因此,我们不想做以下事情:
for (int i = 0; i < N; ++i) {
#pragma omp parallel for schedule(static)
for (int j = first(i); j < last(i); ++j) {
ThreadLocalObject &obj = GetTLO(omp_get_thread_num()); // Costly!
// Do some work with the help of obj
}
}
我该如何解决这个问题?
每个线程应该只请求一次本地对象。
内部循环应该在所有线程之间并行化。
外循环的迭代应该一个接一个地执行。
我的想法如下,但它真的是我想要的吗?
#pragma omp parallel
{
ThreadLocalObject &obj = GetTLS(omp_get_thread_num());
for (int i = 0; i < N; ++i) {
#pragma omp for schedule(static)
for (int j = first(i); j < last(i); ++j) {
// Do some work with the help of obj
}
}
}
【问题讨论】:
-
@HighPerformanceMark,除了错别字,我认为 OPs 问题很有趣,这在最近的 OpenMP 问题中很少见。您在我的解决方案中使用
threadprivate是否有任何 cmets?我是不是弄错了(我现在几乎只用 C,而且我的 C++ 超级生锈)? -
你的方法很好。你能告诉我为什么你需要一个初始化为线程号的线程本地对象吗?
标签: c++ multithreading openmp