f2py - 自动多线程?
f2py - automatic multithreading?
我目前正在编写 Python 代码,为了提高速度,我使用 f2py 移植了一些现有的 Fortran 代码。一切运作良好,加速速度惊人。但是,我发现代码现在似乎 运行 在多个线程上(根据 htop),这是我所做的 而不是 指定的任何地方(也许这是由 f2py 本质上完成的?)。
这是我用来创建模块的命令:
f2py --f90exec="gfortran" --f90flags="" --noopt \
$(ACMLLIB) $(FFTLIB) $(ACMLINC) $(FFTINC) -c -m fmod myCode.f90
其中变量 $(ACMLLIB) $(FFTLIB) $(ACMLINC)
和 $(FFTINC)
是库的路径。
看起来当我 运行 脚本时,它占用了它能找到的所有内核。它这样做我没有问题,但我希望至少能够控制它 - 我怎么能做到这一点,例如设置线程数?
我怀疑,这与此处的 -pthread 选项有关:
....
compiling C sources
C compiler: x86_64-linux-gnu-gcc -pthread -DNDEBUG
-g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -fPIC
....
这是我编译Fortran模块后海量输出的一部分。我不知道该如何处理。
如果能够通过环境变量或其他方式设置 f2py 线程的数量,那就太好了。我四处搜索了一下,但找不到任何关于这样做的信息。
但是,如果您 运行 在 linux 上,例如,您可以使用 taskset
命令行实用程序,它提供了一种固定进程(任何进程)的方法到特定的 cpu 个核心或一组 cpu 个核心。这有点粗糙,但我认为它会完成你所需要的。
有关更多信息,请查看此处,例如:http://xmodulo.com/run-program-process-specific-cpu-cores-linux.html
ACML,AMD 的(现已停产)数学库可以使用多核,请参阅
http://developer.amd.com/tools-and-sdks/archive/compute/amd-core-math-library-acml/acml-product-features/
这就是您很可能看到的原因。这里有文档的副本:https://engineering.ucsb.edu/~stefan/acml.pdf 其中提到使用环境变量 OMP_NUM_THREADS
来控制要使用的 cores/threads 的数量。那是标准的 OpenMP 环境变量。
我目前正在编写 Python 代码,为了提高速度,我使用 f2py 移植了一些现有的 Fortran 代码。一切运作良好,加速速度惊人。但是,我发现代码现在似乎 运行 在多个线程上(根据 htop),这是我所做的 而不是 指定的任何地方(也许这是由 f2py 本质上完成的?)。
这是我用来创建模块的命令:
f2py --f90exec="gfortran" --f90flags="" --noopt \
$(ACMLLIB) $(FFTLIB) $(ACMLINC) $(FFTINC) -c -m fmod myCode.f90
其中变量 $(ACMLLIB) $(FFTLIB) $(ACMLINC)
和 $(FFTINC)
是库的路径。
看起来当我 运行 脚本时,它占用了它能找到的所有内核。它这样做我没有问题,但我希望至少能够控制它 - 我怎么能做到这一点,例如设置线程数?
我怀疑,这与此处的 -pthread 选项有关:
....
compiling C sources
C compiler: x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security -fPIC
....
这是我编译Fortran模块后海量输出的一部分。我不知道该如何处理。
如果能够通过环境变量或其他方式设置 f2py 线程的数量,那就太好了。我四处搜索了一下,但找不到任何关于这样做的信息。
但是,如果您 运行 在 linux 上,例如,您可以使用 taskset
命令行实用程序,它提供了一种固定进程(任何进程)的方法到特定的 cpu 个核心或一组 cpu 个核心。这有点粗糙,但我认为它会完成你所需要的。
有关更多信息,请查看此处,例如:http://xmodulo.com/run-program-process-specific-cpu-cores-linux.html
ACML,AMD 的(现已停产)数学库可以使用多核,请参阅 http://developer.amd.com/tools-and-sdks/archive/compute/amd-core-math-library-acml/acml-product-features/
这就是您很可能看到的原因。这里有文档的副本:https://engineering.ucsb.edu/~stefan/acml.pdf 其中提到使用环境变量 OMP_NUM_THREADS
来控制要使用的 cores/threads 的数量。那是标准的 OpenMP 环境变量。