我正在尝试使用 GNU Parallel 并行启动 Octave 脚本。一切正常,但我对导出的变量有疑问。在使用 GNU Parallel 之前,我的工作流程是打开一个终端,执行export OMP_NUM_THREADS=1
,然后执行我的 Octave 脚本。这样,我为 Octave 使用的 BLAS 分配了 1 个线程。使用 GNU Parallel 时,export OMP_NUM_THREADS=1
在使用 GNU Parallel 之前执行的操作是否足够,或者我应该做些不同的事情?我读过,env_parallel
但我不确定在我的用例中是否需要它,以及如果需要,如何使用它。
这是我在没有 GNU Parallel 的情况下所做的(打开一个终端并):
export OMP_NUM_THREADS=1
octave--gui
这就是我现在使用 GNU Parallel 所做的事情(然后打开一个终端):
export OMP_NUM_THREADS=1
readlink -f ./data/*.csv | parallel "octave validation.m {}"
基本上,我正在尝试并行处理目录中的 CSV 文件validation.m
,并且我想确保 BLAS 只使用 1 个线程。
export variable=value
将设置variable
为value
并将其标记为导出到子进程。这些包括parallel
和octave
以及您在该 shell 中运行的任何其他内容(除非出现极端情况,例如运行env
以覆盖环境中的其他内容)。简而言之,导出的变量对于设置它的环境的所有后代(子进程及其子进程等)都是可见的。
如果您需要更多细节,也许可以阅读 Unix 进程模型;但这并不是很复杂。
据我了解,其目的
env_parallel
是将本地 shell 变量、别名、函数、选项等导出到并行执行的程序中。因此,只有当您想要并行化的是 shell 代码时才有意义(并且只有当该 shell 代码不仅仅是一个独立工作的子进程时,因此该代码恰好是用 bash 编写的,但从并行化的角度来看,这只是一个不透明的程序)。
如果您想用 来做的
parallel
只是运行一些不透明的程序(我的意思是您不打算理会 的内部结构octave
并改变其变量和函数 — — 无论如何,即使您想这样做,由于 octave 不是 bash 代码,env_parallel
也不会有帮助),env_parallel
这与您的问题无关。至少,这是我从您提供的链接的示例中理解到的:它们都是关于“当我使用 parallel 来 fork 一些 bash 代码时如何找到我的函数、别名、本地 shell 变量等”。
由于 octave 是用 C++ 编写的(我认为。至少主程序是这样的),它将成为您想要并行化一些 C++ 代码同时共享一些 C++ 变量、类、函数等的工具。当然,除了那
env_parallel
不起作用之外,因为它只对 shell 代码执行此操作。因此,就您而言,无论 的语言
octave
是用什么语言编写的,您都不必真正关心其内部。您只是碰巧知道,在某个时候,它会执行getenv("OMP_NUM_THREADS")
,或者在其语言中调用的任何操作,并且您想确定结果是什么。而且,正如 tripleee 所说,这就是环境变量的用途。只要octave
进程从您设置环境变量 的进程继承OMP_NUM_THREADS
,就getenv
可以得到它。换句话说,
export OMP_NUM_THREADS=1
在调用 plain 之前,parallel octave
您所需要的就是它。env_parallel
但这并不是全部。