- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的代码:
double res1[NNN];
#pragma omp parallel for collapse(3) schedule(dynamic)
for (int i=0; i<NNN; i++)
{
for (int j=0;j<NNN;j++)
{
for (int k=0;k<NNN;k++)
{
res1[i] = log(fabs(i*j*k));
}
}
}
std::cout<< res1[10] << std::endl;
collapse(3)
大约需要 50 秒;没有
collapse(3)
仅约 6-7 秒。我对这种行为感到非常困惑,因为我本来希望“崩溃”比没有更好的表现。
schedule(STATIC)
&& collapse(3)
-> ~54 秒 schedule(STATIC)
&& collapse(2)
-> ~8 秒 schedule(STATIC)
&& collapse(1)
-> ~8 秒 DYNAMIC
计划,但需要大量时间(几分钟)。
最佳答案
您缺少使用动态调度对 OpenMP 开销有何影响的概念。
应该使用动态调度来帮助我们解决负载平衡问题,其中每个循环迭代可能需要不同的时间,而静态迭代分布很可能会在不同线程之间造成工作不平衡。工作不平衡会导致 CPU 时间浪费,因为较早完成的线程只是等待其他线程完成。
动态调度通过以先到先得的方式分发循环块来克服这个问题。但这会增加开销,因为 OpenMP 运行时系统必须实现记录哪些迭代被发出,哪些没有并且必须实现某种类型的同步。此外,每个线程在每次完成其迭代块并寻找另一个时都必须至少调用一次 OpenMP 运行时。使用静态调度,所有迭代块最初都是预先计算的,然后每个线程运行其部分,而无需与 OpenMP 运行时环境进行任何交互。
静态和动态调度之间最重要的区别是迭代块大小(即每个线程在寻求在迭代空间的另一部分工作之前所做的连续循环迭代次数)。如果省略,静态调度的块大小默认为 #_of_iterations/#_of_threads
而动态调度的默认块大小是 1
,即每个线程必须针对分布式循环的每次迭代询问 OpenMP 运行时。
在你的情况下会发生什么是没有 collapse(3)
你有 NNN
外循环的迭代块和每个线程运行 NNN*NNN
在要求 OpenMP 运行时进行另一次迭代之前进行(内部循环的)迭代。当您折叠循环时,迭代块的数量增加到 NNN*NNN*NNN
,即有更多的块,并且每个线程将在每次迭代后向 OpenMP 运行时询问一个块。
当内循环与最外循环折叠时,这会带来另一个问题:许多线程将获得具有相同值 i
的迭代。 ,这会破坏计算,因为无法保证执行顺序,并且可能会发生写入 res1[i]
的最后一个线程。不是执行两个内部循环的最后一次迭代的那个。
关于performance - 带有 "collapse()"的用于嵌套 for 循环的 OpenMP 在没有时性能更差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15160570/
我有一个数据库,其中所有表都包含 Site 列 (char(4)) 和 PrimaryId 列 (int )。 目前所有表上的聚集索引都是这两列的组合。许多客户只有一个网站,因此在这些情况下,我认为将
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我一直在阅读有关使用 token 进行身份验证的文章。但是,我无法理解 token (JWT) 与 cookie 有何不同。两者都将存储用户信息(作为 token 中的声明),定义了持久性,并将与每个
我首先使用 keras 1.2.0 在 CPU 上运行相同的代码(具有相同的数据),然后在两种代码中运行 keras 2.0.3 . 当我使用 keras 2.0.3 获得 42 的 MSE(均方误差
我是一名优秀的程序员,十分优秀!