将 python 与带有 openmp 的 DLL 一起使用,而不使用所有内核

时间:2021-02-25 09:22:35

标签: python c++ openmp

我正在使用 python 3.8 和一个用 C++ 编写的计算 DLL,并使用 openmp 来使用所有 CPU 的内核。 当我测试 C++ 代码时,它使用了所有 CPU 的内核。但是当我将它编译为 DLL 并从 python 使用它时,它只使用 1 个内核,就像 Python 限制库只使用 1 个内核一样。

如果我做错了什么,这是我的库编译行:

g++ -O3 -Wall -c -fmessage-length=0 -fopenmp -pthread -o "src\\Environnement.o" "..\\src\\Environnement.cpp" 
g++ -O3 -Wall -c -fmessage-length=0 -fopenmp -pthread -o "src\\LexicalAnalyser.o" "..\\src\\LexicalAnalyser.cpp"
g++ -O3 -Wall -c -fmessage-length=0 -fopenmp -pthread -o "src\\Fun.o" "..\\src\\Fun.cpp"
g++ -O3 -Wall -c -fmessage-length=0 -fopenmp -pthread -o "src\\lib.o" "..\\src\\lib.cpp"
g++ -O3 -Wall -c -fmessage-length=0 -fopenmp -pthread -o "src\\Status.o" "..\\src\\Status.cpp" 
g++ -O3 -Wall -c -fmessage-length=0 -fopenmp -pthread -o "src\\Lexem.o" "..\\src\\Lexem.cpp" 
g++ -shared -o libSyntaxicAnalyser.dll "src\\Environnement.o" "src\\Fun.o" "src\\Lexem.o" "src\\LexicalAnalyser.o" "src\\Status.o" "src\\Variable.o" "src\\lib.o" "D:\\Apps\\mingw\\lib\\gcc\\mingw32\\9.2.0\\libgomp.a" -pthread

但我觉得 python GIL 也适用于 C++ 库并阻止它使用所有 cpu 的内核...... 有人有答案吗?

非常感谢 山姆

1 个答案:

答案 0 :(得分:0)

所以在挖掘之后,我发现了两件事:

  • 如果使用 CDLL 调用,GIL 不适用于 DLL。 (如果您使用 PyDLL,则 GIL 适用于 dll:https://docs.python.org/3.8/library/ctypes.html#loading-shared-libraries
  • 在我的 C++ 链接器命令行中,缺少 gomp 库 (-lgomp)。这是正确的命令: g++ -LD:/Apps/mingw/lib/gcc/mingw32/9.2.0 -shared -o libSyntaxicAnalyser.dll "src\\Environnement.o" "src\\Fun.o" "src\\Lexem.o" "src\\LexicalAnalyser.o" "src\\Status.o" "src\\Variable.o" "src\\lib.o" "src\\main.o" -lgomp -pthread

现在它起作用了!

干杯