OpenMP 如何知道嵌套了多少个循环实例
How can OpenMP know how many loop instances are nested?
我很久以前就使用OpenMP编写c ++程序。突然,一个问题出现在我的脑海中。
"OpenMP 如何知道嵌套了多少个循环实例?">
编译器是否显式计数?
OpenMP 运行时在线程局部变量中跟踪此信息。
libgomp
,目前最流行的 OpenMP 实现之一可能是开源的;这意味着人们不仅可以完全免费地阅读其文档,还可以阅读其源代码。
omp_get_level()
的实现如下:
int
omp_get_level (void)
{
return gomp_thread ()->ts.level;
}
gomp_thread()
的实施在这里。它检索指向线程本地结构的指针。
#if defined __nvptx__
extern struct gomp_thread *nvptx_thrs __attribute__((shared));
static inline struct gomp_thread *gomp_thread (void)
{
int tid;
asm ("mov.u32 %0, %%tid.y;" : "=r" (tid));
return nvptx_thrs + tid;
}
#elif defined HAVE_TLS || defined USE_EMUTLS
extern __thread struct gomp_thread gomp_tls_data;
static inline struct gomp_thread *gomp_thread (void)
{
return &gomp_tls_data;
}
#else
extern pthread_key_t gomp_tls_key;
static inline struct gomp_thread *gomp_thread (void)
{
return pthread_getspecific (gomp_tls_key);
}
#endif
数据结构ts
是一个struct gomp_team_state
,其中包括:
[...]
/* Nesting level. */
unsigned level;
/* Active nesting level. Only active parallel regions are counted. */
unsigned active_level;
[...]
每当使用#pragma omp parallel
时,编译器都会将并行部分的主体提取到一个子函数中,并生成一组复杂的函数调用,最终导致gomp_team_start()
,其中包含:
#ifdef LIBGOMP_USE_PTHREADS
void
gomp_team_start (void (*fn) (void *), void *data, unsigned nthreads,
unsigned flags, struct gomp_team *team)
{
[...]
++thr->ts.level;
if (nthreads > 1)
++thr->ts.active_level;
相关文章:
- 如何在 c++ 中按预定义的顺序循环浏览类实例?
- 删除功能不适用于串行通信后多个循环中的多个实例
- 如何通过循环访问数组来读取和存储实例的值?
- OpenMP 如何知道嵌套了多少个循环实例
- 为什么这个循环模板实例化是合法的?
- 无法在循环中实例化泛型函数
- 如何使递归函数在进入下一级循环之前读取每个新实例
- 超级级别的方法称为super具有sub的str attr 实例在循环 实例中创建的方法是作为super的指针存储在向
- C 是否有办法仅返回for循环的最后一个实例
- 如何在异构类的实例上循环调用具有相同名称和参数的方法
- 可以在C++14 constexpr函数中使用for循环实例化模板
- 虽然循环不输出子字符串的下一个实例
- C++:由于 #include 循环,无法将对象实例传递给另一个类
- 为什么在C++中复制循环中的对象实例会占用大量内存
- 循环访问指向 C++ 中的实例的指针数组数组所需的声明
- 在循环中创建实例并将它们保存到另一个向量中最有效的方法是什么?
- 在循环中初始化预分配的结构体实例
- 尝试将用户定义类的实例排入队列时出现无限循环(?)
- 继承和返回实例的循环依赖性问题
- 使用for循环实例化映射