OpenMP - 随机 运行ning 时间 - 为什么 运行 时间方差这么高?
OpenMP - Random running time - why having so high run-time variance?
我正在关注 Tim Mattson 关于 OpenMP 的讲座,以学习一些并行编程概念的实现方式。
我试图观察使用 3x10^8[= 计算 PI 值的并行程序的 运行ning 时间行为34=]步。
这是代码,
#include <omp.h>
#include <stadio.h>
static long num_steps = 300000000;
double step;
#define PAD 8 // tried 50 too
#define NUM_THREADS 4
int main()
{
int i, nthreads;
double pi, sum[NUM_THREADS][PAD];
double ts, te;
ts = omp_get_wtime();
step = 1.0/(double) num_steps;
omp_set_num_threads(NUM_THREADS);
#pragma omp parallel
{
int i, id,nthrds;
double x;
id = omp_get_thread_num();
nthrds = omp_get_num_threads();
if (id == 0) nthreads = nthrds;
for (i=id, sum[id]=0.0;i< num_steps; i=i+nthrds) {
x = (i+0.5)*step;
sum[id][0] += 4.0/(1.0+x*x);
}
}
for(i=0, pi=0.0;i<nthreads;i++)
pi += sum[i][0] * step;
te = omp_get_wtime();
printf("%.10f\n", pi);
printf("%.f\n", te-ts);
}
现在我在双核机器上使用 Ubuntu 14.04 LTS 运行ning。对 omp_get_num_procs()
的调用返回 2。 运行ning 时间完全随机,从 1.31 秒到 4.46 秒不等。而串行程序几乎总是花费 2.31 秒。
我尝试创建 1、2、3、4,最多 10 个线程。 运行ning 时间在每种情况下变化太大,但在更多线程的情况下平均值更小。我没有 运行任何其他应用程序。
谁能解释一下为什么 运行ning 时间变化太大?
如何准确计算运行时间?讲师给出了他的计算机的 运行ning 时间,这似乎是一致的。而且他还用的是双核处理器。
Dual-CPU 比较,使用 OpenMP :
Result : 3.1415926536
Number of CPU-s : 2
Duration : 2.4025482161
结果代码执行时间似乎非常一致:
/* Duration : 2.3984972970
Duration : 2.4004815188
Duration : 2.3814983589
Duration : 2.4070654172
Duration : 2.3964317020
Duration : 2.3858104548
Duration : 2.3765923560
Duration : 2.3734730321
-O3:
Duration : 0.4159400249
Duration : 0.3089567909
Duration : 0.3106977220
Duration : 0.3312316008
Duration : 0.2856188160
Duration : 0.2984415500
Duration : 0.3282426349
Duration : 0.2836121118
:......
+ FYI: #pragma-overheads :......
Duration : 0.0001377461
Duration : 0.0001228561
Duration : 0.0001215260
REF:
Amdahl's Law >>> https://whosebug.com/revisions/18374629/3
criticism,
on
(not-)including also the real-world's infrastructure add-on
{ setup | termination }-overhead costs of #pragma omp parallel section
(
simplified test w/o the add-on costs of global OpenMP setup & configuration
)
*/
将注意力转移到您的 System-under-Test 工作负载背景噪音。
最好在无头平台上重新测试您的代码,以避免任何类型的 GUI 相关工作负载干扰测试的计算部分。
可以享受这个sandboxed online-TiO-platform重新运行实验。
我正在关注 Tim Mattson 关于 OpenMP 的讲座,以学习一些并行编程概念的实现方式。
我试图观察使用 3x10^8[= 计算 PI 值的并行程序的 运行ning 时间行为34=]步。
这是代码,
#include <omp.h>
#include <stadio.h>
static long num_steps = 300000000;
double step;
#define PAD 8 // tried 50 too
#define NUM_THREADS 4
int main()
{
int i, nthreads;
double pi, sum[NUM_THREADS][PAD];
double ts, te;
ts = omp_get_wtime();
step = 1.0/(double) num_steps;
omp_set_num_threads(NUM_THREADS);
#pragma omp parallel
{
int i, id,nthrds;
double x;
id = omp_get_thread_num();
nthrds = omp_get_num_threads();
if (id == 0) nthreads = nthrds;
for (i=id, sum[id]=0.0;i< num_steps; i=i+nthrds) {
x = (i+0.5)*step;
sum[id][0] += 4.0/(1.0+x*x);
}
}
for(i=0, pi=0.0;i<nthreads;i++)
pi += sum[i][0] * step;
te = omp_get_wtime();
printf("%.10f\n", pi);
printf("%.f\n", te-ts);
}
现在我在双核机器上使用 Ubuntu 14.04 LTS 运行ning。对 omp_get_num_procs()
的调用返回 2。 运行ning 时间完全随机,从 1.31 秒到 4.46 秒不等。而串行程序几乎总是花费 2.31 秒。
我尝试创建 1、2、3、4,最多 10 个线程。 运行ning 时间在每种情况下变化太大,但在更多线程的情况下平均值更小。我没有 运行任何其他应用程序。
谁能解释一下为什么 运行ning 时间变化太大?
如何准确计算运行时间?讲师给出了他的计算机的 运行ning 时间,这似乎是一致的。而且他还用的是双核处理器。
Dual-CPU 比较,使用 OpenMP :
Result : 3.1415926536
Number of CPU-s : 2
Duration : 2.4025482161
结果代码执行时间似乎非常一致:
/* Duration : 2.3984972970
Duration : 2.4004815188
Duration : 2.3814983589
Duration : 2.4070654172
Duration : 2.3964317020
Duration : 2.3858104548
Duration : 2.3765923560
Duration : 2.3734730321
-O3:
Duration : 0.4159400249
Duration : 0.3089567909
Duration : 0.3106977220
Duration : 0.3312316008
Duration : 0.2856188160
Duration : 0.2984415500
Duration : 0.3282426349
Duration : 0.2836121118
:......
+ FYI: #pragma-overheads :......
Duration : 0.0001377461
Duration : 0.0001228561
Duration : 0.0001215260
REF:
Amdahl's Law >>> https://whosebug.com/revisions/18374629/3
criticism,
on
(not-)including also the real-world's infrastructure add-on
{ setup | termination }-overhead costs of #pragma omp parallel section
(
simplified test w/o the add-on costs of global OpenMP setup & configuration
)
*/
将注意力转移到您的 System-under-Test 工作负载背景噪音。
最好在无头平台上重新测试您的代码,以避免任何类型的 GUI 相关工作负载干扰测试的计算部分。
可以享受这个sandboxed online-TiO-platform重新运行实验。