我使用 openMP 库使我的代码并行化。我需要在我学院的 HPC(16 个节点)上运行代码。当我运行代码时,HPC 会随机将来自不同 Blade 服务器的节点分配给我的程序。我不知道节点是否有共享内存,但代码执行正常。我的问题:
如果内存是分布式的而不是共享的,代码是否应该给我一个错误,或者它会正常运行但生成错误数据?
有没有办法知道我的代码使用的节点是否共享内存?
(我知道我可以使用 MPI 来使用分布式内存上的代码,但目前我没有时间这样做。)
最佳答案
OpenMP 是一种并行编程模型,它仅通过线程的方式运行在共享内存系统之上,除非使用特殊的通信调用(例如 MPI,或系统套接字调用,或 PGAS 编程),否则无法与其他节点通信模型)。您的 OpenMP 应用程序执行良好这一事实是正常的,因为您始终可以在节点内创建线程。
关于您的问题:
1) OpenMP 运行时只会看到节点内的共享资源,而不是节点外的所有资源。这意味着您的 OpenMP 二进制文件不会传播到 HPC 集群的其他节点(同样,除非您使用 MPI)。关于计算资源,OpenMP 运行时将创建与处理器一样多的线程,除非您通过 OMP_NUM_THREADS 环境变量明确请求不同数量的线程。
2) 您的代码将始终在线程之间共享内存,由于线程描述,这是正常的。来自维基百科https://en.wikipedia.org/wiki/Thread_(computing)
Multiple threads can exist within the same process, executing concurrently (one starting before others finish) and share resources such as memory, while different processes do not share these resources.
关于c++ - 在集群上使用 OpenMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33508741/