gpt4 book ai didi

python - 从 Python 和环境变量调用 OpenMP C 库

转载 作者:太空宇宙 更新时间:2023-11-03 23:42:32 24 4
gpt4 key购买 nike

我想从 Python 调用一些 OpenMP 程序,更改线程数 (OMP_NUM_THREADS) 及其绑定(bind)(OMP_PLACESOMP_PROC_BIND ).我写了这个程序:

import os
from ctypes import cdll

lib = cdll.LoadLibrary("/home/fayard/Desktop/libf.so")

nb_socket = 2
nb_core_per_socket = 14
nb_thread_per_core = 2

n = nb_socket * nb_core_per_socket * nb_thread_per_core

for nb_thread in range(1, n + 1):
os.environ['OMP_NUM_THREADS'] = str(nb_thread)
print("nb_thread: {}, omp_get_num_threads: {}".format(
nb_thread, lib.num_threads()))

OpenMP 库如下:

#include <omp.h>

extern "C" {

int num_threads() {
int ans;
#pragma omp parallel
{
#pragma omp single
ans = omp_get_num_threads();
}

return ans;
}

}

并编译为:

g++ -c -fPIC -fopenmp f.cpp -o f.o
g++ -shared -fopenmp -Wl,soname,libf.so -o libf.so f.o

当我运行 python program.py 时,我得到:

nb_thread: 1, omp_get_num_threads: 56
...
nb_thread: 56, omp_get_num_threads: 56

这不是我想要的!我还意识到,当使用具有完全相同参数的英特尔编译器进行编译时,我得到:

nb_thread: 1, omp_get_num_threads: 1
...
nb_thread: 56, omp_get_num_threads: 1

有什么问题吗?

最佳答案

环境变量只控制内部控制变量的初始设置。

[OpenMP 4.5] 4. Environment variables

Modifications to the environment variables after the program has started, even if modified by the program itself, are ignored by the OpenMP implementation. However, the settings of some of the ICVs can be modified during the execution of the OpenMP program by the use of the appropriate directive clauses or OpenMP API routines.

您可以围绕 omp_set_num_threads 编写一个小包装器,但是您不能动态更改绑定(bind)。

不幸的是,unload shared librareies in ctypes 没有干净的解决方案.另一种方法是使用 subprocess 运行一个实际的程序,而不是加载一个库,但是你有一个不同的界面。

如果您必须使用共享库并控制动态绑定(bind),您可以在由 python 调用的共享库中使用 sched_setaffinity 手动执行一些操作。

gcc 和 intel 运行时行为不同的原因可能是因为您在加载库后设置环境变量并且它们的初始化完成方式不同。

关于python - 从 Python 和环境变量调用 OpenMP C 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41616548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com