【问题标题】:How OpenMP divide a loop into threads?OpenMP 如何将循环划分为线程?
【发布时间】:2013-10-13 16:12:18
【问题描述】:

假设我有一个循环

for(int i = 0; i < 1000; i++){
    sum += i;
}

如果我使用 OpenMP 来加速它,这个 for 循环如何映射到 4 个不同的内核?

我知道它使用 fork 和 join,我的意思是 i=0 代表核心 0,i=1 代表核心 1 等等,还是 i=0 代表核心 0,i=249 代表核心 1,i = 499 代表核心2等

谢谢,

鲍勃

【问题讨论】:

  • 只需检查 wiki en.wikipedia.org/wiki/OpenMP 它使用分叉连接模型
  • @pyCthon 我知道它使用 fork 和 join,我的意思是 i=0 代表核心 0,i=1 代表核心 1 等等,还是 i=0 代表核心 1,i=249 代表core 2, i = 499 for core 3 etc.
  • @Gangadhar 很酷,谢谢,我认为这回答了我的问题。
  • 这是一个微不足道的循环,它无法明智地映射到多个内核。即使在同一个盒子上,这样一个循环的运行时间也少于将它排队到池中的线程间通信开销。

标签: c optimization openmp


【解决方案1】:

根据this presentation ,它取决于编译器实现而不是 OpenMP 规范,但编译器可能会将 i=0 用于核心 0,i=249 用于核心 1,等等。

还要确保您是 sum 的归约变量,否则您的示例中有竞争条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多