【问题标题】:Software parallelization with OpenMP versus Affinity scheduling?OpenMP 与 Affinity 调度的软件并行化?
【发布时间】:2016-04-20 19:22:49
【问题描述】:

场景:我有一个可以轻松使用 OpenMP 并行化的程序,假设程序的主循环是一个 for 循环和其中的独立数据,因此并行化它是微不足道的。但是目前我不将其并行化,而是使用关联调度。

此程序对命令行参数中文件夹指定的一些输入文件执行工作。要并行运行这个程序,有人可以像这样创建一个 bat 文件:

start \affinity 1 "1" bat1
start \affinity 2 "2" bat2
start \affinity 3 "3" bat3
start \affinity 4 "4" bat4

其中 bat1 - 4 是一个调用 main.exe 的 bat 文件,每个 bat 文件都有不同的输入文件夹。所以在这种情况下,将有 4 个 main.exe 实例分别在 input_folder1, input_folder2, input_folder3, input_folder4 上运行。

使用像 OpenMP 这样的库代替亲和性调度有什么好处?我想

  • 与nn 内核的程序实例相比,单个程序实例的内存使用量、单个堆栈和堆更少
  • 更好的缩放

但我是否真的希望看到性能提升?为什么会这样?

【问题讨论】:

  • 用户不必每次必须并行运行时都创建一个巨大的 bat 文件的好处是什么?

标签: c++ c parallel-processing openmp affinity


【解决方案1】:

如果您的问题是简单的并行问题,在单独的输入文件中的数据之间没有交互,那么您可能不会看到 OpenMP 的加速,甚至可能会减速,因为内存分配和其他各种事情然后必须是线程安全的。单线程进程可以提高效率,实际上在 GNU libc 上也可以,在 POSIX 线程支持中的链接意味着您还可以更慢地实现 malloc

【讨论】:

  • 关于malloc 的最后一句话很有趣。您能否提供一些指向 glibc 源代码或支持它的文档的指针?我没有看到malloc 在 glibc 2.12 或更高版本中出现不同版本,尽管 ptmalloc2 可以在没有线程安全的情况下编译。此外,该库可以选择为每个内核创建一个内存区域,用于(几乎)无锁实现 malloc,并且至少基于 RedHat 的发行版会启用该选项。
  • 这是记忆中的,但我记得与-lpthread 的链接得到了不同的版本,或者可能是插入了 malloc 的构建配置。
猜你喜欢
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 2013-12-08
  • 2015-08-18
  • 1970-01-01
相关资源
最近更新 更多