首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法理解libgomp如何实现FOR构造

无法理解libgomp如何实现FOR构造
EN

Stack Overflow用户
提问于 2017-10-16 06:07:54
回答 1查看 205关注 0票数 1

根据libgomp手册,表格中的代码:

代码语言:javascript
复制
#pragma omp parallel for
for (i = lb; i <= ub; i++)
  body;

变成了

代码语言:javascript
复制
void subfunction (void *data)
{
  long _s0, _e0;
  while (GOMP_loop_static_next (&_s0, &_e0))
  {
    long _e1 = _e0, i;
    for (i = _s0; i < _e1; i++)
      body;
  }
  GOMP_loop_end_nowait ();
}

GOMP_parallel_loop_static (subfunction, NULL, 0, lb, ub+1, 1, 0);
subfunction (NULL);
GOMP_parallel_end ();

我做了一个非常小的程序来调试,只是为了看看这个实现是如何工作的:

代码语言:javascript
复制
int main(int argc, char** argv)
{
  int res, i;
  # pragma omp parallel for num_threads(4)
  for(i = 0; i < 400000; i++) 
      res = res*argc;

  return 0;
} 

接下来,我运行gdb并将断点设置为"GOMP_parallel_loop_static“和"GOMP_parallel_end”。在开始时,库没有加载,所以它们是挂起的。在gdb中运行测试程序时,我得到了以下结果:

代码语言:javascript
复制
(gdb) run 2 1 6 5 4 3 8 7
Starting program: ./test 2 1 6 5 4 3 8 7
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-
gnu/libthread_db.so.1".
[New Thread 0x7ffff73c9700 (LWP 5381)]
[New Thread 0x7ffff6bc8700 (LWP 5382)]
[New Thread 0x7ffff63c7700 (LWP 5383)]

 Thread 1 "test" hit Breakpoint 2, 0x00007ffff7bc0c00 in GOMP_parallel_end () from /usr/lib/x86_64-linux-gnu/libgomp.so.1

如您所见,它到达了"GOMP_parallel_end“中的第二个断点,但没有到达第一个断点。我想知道,如果libgomp手册清楚地显示"GOMP_parallel_loop_static“是第一位的,这怎么可能。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-16 13:29:15

GCC的这部分文档并没有被定期更新,所以仅仅把它看作是真实发生的事情的近似值可能是个好主意。如果您对这一级别的细节感兴趣,我建议您查看-fdump-tree-all生成的调试文件和类似的选项。

使用最新版本的GCC,您的示例将生成对__builtin_GOMP_parallel的调用,该调用映射到GOMP_parallel。在最后那个内部调用GOMP_parallel_end,所以我想这就是您所看到的。

代码语言:javascript
复制
void
GOMP_parallel (void (*fn) (void *), void *data, unsigned num_threads, unsigned int flags)
{ 
  num_threads = gomp_resolve_num_threads (num_threads, 0);
  gomp_team_start (fn, data, num_threads, flags, gomp_new_team (num_threads));
  fn (data);
  ialias_call (GOMP_parallel_end) ();
}

当然,更新文档的补丁将被欣然接受。:-)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46763887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档