我使用openMP库使我的代码并行。我需要在我大学的HPC(16个节点)上运行代码。当我运行代码时,HPC随机地将来自不同刀片的节点分配给我的程序。我不知道节点是否有共享内存,但代码执行正常。我的问题:
如果内存是分布式的并且没有共享,或者它是否正常运行但生成错误的数据,代码是否应该给我一个错误?
有没有办法知道我的代码使用的节点是否有共享内存?
(我知道我可以使用MPI在分布式内存上使用代码,但目前我没有时间。)
答案 0 :(得分:3)
OpenMP是一种并行编程模型,它仅通过线程在共享内存系统之上运行,除非您使用特殊的通信调用(例如MPI,系统套接字调用或PGAS编程),否则无法与其他节点通信模型)。您的OpenMP应用程序执行正常的事实是正常的,因为您始终可以在节点内创建线程。
关于你的问题:
1)OpenMP运行时只能看到节点内的共享资源,而不能看到节点外的所有资源。这意味着您的OpenMP二进制文件不会传播到HPC群集的其他节点(同样,除非您使用MPI)。关于计算资源,OpenMP运行时将创建与处理器一样多的线程,除非您通过OMP_NUM_THREADS环境变量显式请求不同数量的线程。
2)您的代码将始终在线程之间共享内存,这是正常的,因为线程描述。来自维基百科https://en.wikipedia.org/wiki/Thread_(computing)
多个线程可以存在于同一个进程中,执行 同时(一个在其他人完成之前开始)并共享资源 例如内存,而不同的进程不共享这些 资源。