2015-11-03 104 views
0

我使用openMP库使我的代码并行。我需要在我大学的HPC(16个节点)上运行代码。当我运行代码时,HPC会将不同刀片的节点随机分配给我的程序。我不知道节点是否有共享内存,但代码正常执行。我的问题:在群集上使用OpenMP

  1. 是应该的代码,如果内存分配给我的错误,而不是共享或它运行正常,但产生错误的数据?

  2. 有没有办法知道我的代码使用的节点是否具有共享内存?

(我知道我可以使用MPI使用的代码是在分布式内存,但目前我没有对的时间。)

回答

2

OpenMP的是,在上面运行的并行编程模型共享内存系统只能通过线程的方式,除非使用特殊的通信调用(如MPI,系统套接字调用或PGAS编程模型),否则不能与其他节点通信。 OpenMP应用程序执行正常的事实是正常的,因为您始终可以在节点中创建线程。

关于你的问题:

1)OpenMP运行时只会看到一个节点中的共享资源,不是所有的资源的节点之外。这意味着OpenMP二进制文件不会扩展到HPC群集的其他节点(同样,除非您使用MPI)。关于计算资源,除非您通过OMP_NUM_THREADS环境变量显式请求不同数量的线程,否则OpenMP运行时将创建与处理器一样多的线程。

2)您的代码将始终在线程之间共享内存,这是由于线程描述的原因。维基百科可以在同一进程中存在https://en.wikipedia.org/wiki/Thread_(computing)

的多个线程,执行 同时(在别人面前一个起点完成)并共享资源 如内存,而不同的进程不共享这些资源 。

+0

这是否意味着理论上我可以在单个内核上运行尽可能多的线程? –

+1

是的,你可以做到这一点。这就是所谓的超额认购。通过产生更多的MPI进程,也可以单独使用MPI,而不是集群中可用的处理器数量。这就是说,如果所有线程同时运行,超额认购可能会导致性能低下,因为没有足够的计算资源用于所有线程(或MPI应用程序中的进程)。 – Harald

+0

为了完整起见,有DSM解决方案,它允许在多个群集节点上运行未经修改的OpenMP应用程序:[请参阅此处](http://stackoverflow.com/q/13475838/1374437)。 –