首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >omp_get_wtime()和mpi_wtime()在使用MPI和共享内存并行化时的区别

omp_get_wtime()和mpi_wtime()在使用MPI和共享内存并行化时的区别
EN

Stack Overflow用户
提问于 2014-03-27 19:11:01
回答 1查看 1.8K关注 0票数 0

我使用OpenMPI和OpenMP (共享内存)并行化一段代码。我试图为基准测试和加速目的对代码进行计时,但我不理解omp_get_wtime()和mpi_wtime()之间的区别。

下面是我的代码与它运行的体系结构一起做的工作的概要:

我有8个节点,每个节点都有16个处理器。我有128个任务要运行。

我正在测试两种场景,我想知道哪一种更快。

第一个场景:我给每个节点1/8的任务(使用OpenMPI),对于每个任务,该节点使用它的16个处理器(使用OpenMP)来完成任务。因此,Node0将执行Task0,当Task0完成时,它将执行Task8,当Task8完成时,将执行Task16;同时,Node1将执行Task1,然后是Task9,然后是Task15等等,直到每个任务完成为止。我想知道整个过程需要多长时间,最好知道每项任务平均需要多长时间才能完成。

第二个场景:我将128个任务中的每一个放在一个处理器上(使用MPI)。我只想知道这需要多长时间才能运行,如果知道每个处理器需要多长时间才能完成它的工作,那就太好了。

基本上,我在这里所做的是比较MPI+OpenMP与仅仅在我的代码中使用MPI相比。

我应该使用哪个计时器,两者有什么区别?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-27 23:08:46

omp_get_wtime()MPI_WTIME之间没有主要区别。这两种都是亚秒级的精确壁钟定时器,返回过去某个时间点以来所经过的时间。通过重复调用它们并减去值,两者的用法也是相同的,例如:

代码语言:javascript
运行
复制
double tmr = omp_get_wtime();
...
// routine to be timed
...
tmr = omp_get_wtime() - tmr;
// tmr now holds the elapsed time in seconds

或者:

代码语言:javascript
运行
复制
double tmr = MPI_Wtime();
...
// routine to be timed
...
tmr = MPI_Wtime() - tmr;
// tmr now holds the elapsed time in seconds

这两个函数都是本地的,例如,它们测量执行调用代码的节点上的时间。允许在所有节点上同步MPI_WTIME,但很少有实现这样做。它们在所有其他方面都应该是相当平等的,并且提供类似的精度(而且在大多数平台上,这两者通常都是使用相同的操作系统特定计时器例程实现的)。过去绝对不能保证这两个定时器具有相同的参考点,因此不应将它们混在一起,例如以下是无效代码:

代码语言:javascript
运行
复制
double tmr = MPI_Wtime();
...
tmr = omp_get_wtime() - tmr;
// tmr now holds the elapsed time in seconds + possibly a constant difference

我最好将MPI_WTIME用于omp_get_wtime(),这取决于是否启用了OpenMP。如果允许您的程序同时编译为纯MPI和混合MPI+OpenMP,那么最好不要对OpenMP运行时库进行多次(或任何)调用,否则当OpenMP未启用时,您将不得不为这种情况提供存根实现。当然,混合代码的存根omp_get_wtime()实现需要一个预处理宏:

代码语言:javascript
运行
复制
#define omp_get_wtime MPI_Wtime
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22697001

复制
相关文章

相似问题

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