为什么在openmp中动态调度比静态调度快
Why dynamic scheduling is faster than static scheduling in openmp
我正在学习并行编程,我正在尝试弄清楚动态调度和静态调度之间的区别。
据我所知,到目前为止,静态应该比动态更快,因为静态中的块是在编译期间计算并调度到线程的,而不是在 运行 时间内。但是我执行下面的程序,静态时间结果比动态时间大......为什么会这样?请帮助我。
提前致谢。
#pragma omp parallel shared(a,b,c,nthreads,chunk) private(i,tid)
{
tid = omp_get_thread_num();
if (tid == 0){
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}
printf("Thread %d starting...\n",tid);
#pragma omp for schedule(static,chunk)
for (i=0; i<N; i++){
c[i] = a[i] + b[i];
printf("Thread %d: c[%d]= %f\n",tid,i,c[i]);
}
}
评估任何一段代码的性能真的很难,尤其是这么短的一段代码。从您的特定机器开始,影响因素有很多。您 运行 编码了多少次?每个 运行 多长时间?您需要良好的统计数据才能明确地说出某些东西 faster/slower 而不是其他东西。即使那样,其他人也可能并非如此。您使用的是什么处理器,它有多少个内核,您调度了多少个线程?
很多还可以取决于你选择的chunk
尺码。也许您所做的选择不是最优的。如果您想了解更多信息,请扫描 chunk
的各种值并对性能进行基准测试。话虽这么说,您观察的可能原因是您的系统在两次测试中的使用方式不同。动态调度更适应 运行 时间条件。
我正在学习并行编程,我正在尝试弄清楚动态调度和静态调度之间的区别。
据我所知,到目前为止,静态应该比动态更快,因为静态中的块是在编译期间计算并调度到线程的,而不是在 运行 时间内。但是我执行下面的程序,静态时间结果比动态时间大......为什么会这样?请帮助我。
提前致谢。
#pragma omp parallel shared(a,b,c,nthreads,chunk) private(i,tid)
{
tid = omp_get_thread_num();
if (tid == 0){
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}
printf("Thread %d starting...\n",tid);
#pragma omp for schedule(static,chunk)
for (i=0; i<N; i++){
c[i] = a[i] + b[i];
printf("Thread %d: c[%d]= %f\n",tid,i,c[i]);
}
}
评估任何一段代码的性能真的很难,尤其是这么短的一段代码。从您的特定机器开始,影响因素有很多。您 运行 编码了多少次?每个 运行 多长时间?您需要良好的统计数据才能明确地说出某些东西 faster/slower 而不是其他东西。即使那样,其他人也可能并非如此。您使用的是什么处理器,它有多少个内核,您调度了多少个线程?
很多还可以取决于你选择的chunk
尺码。也许您所做的选择不是最优的。如果您想了解更多信息,请扫描 chunk
的各种值并对性能进行基准测试。话虽这么说,您观察的可能原因是您的系统在两次测试中的使用方式不同。动态调度更适应 运行 时间条件。