c++ - 在集群上使用 OpenMP

标签 c++ openmp

我使用 openMP 库使我的代码并行化。我需要在我学院的 HPC(16 个节点)上运行代码。当我运行代码时,HPC 会随机将来自不同 Blade 服务器的节点分配给我的程序。我不知道节点是否有共享内存,但代码执行正常。我的问题:

  1. 如果内存是分布式的而不是共享的,代码是否应该给我一个错误,或者它会正常运行但生成错误数据?

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

(我知道我可以使用 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/

相关文章:

fortran - 嵌套循环的 OpenMP SIMD 矢量化

xcode 中的 c++ : error when calling any(! !!!) 来自 main 中自定义对象的方法

c++ - 专用于私有(private)成员类的 std::hash

c - OpenMP 中的高斯消除 - 无法并行化

openmp - 如何在 gem5 完整系统中编译和运行 C 程序(使用 OpenMP)?

c++ - Intel TBB 禁用嵌套并行

c - 手动填充数组

c++ - 是否有 libcurl 最大读取大小? curl 拆分读取为两部分

c++ - 从参数包中的派生调用基类运算符=

c++ - 静态变量输入时存储什么值?