簡體   English   中英

使用 OMP_NUM_THREADS=1 進行 Python 多處理

[英]Use of OMP_NUM_THREADS=1 for Python Multiprocessing

我聽說在調用使用多處理的 Python 腳本之前使用OMP_NUM_THREADS=1會使腳本更快。

這是真的還是假的? 如果是,為什么會這樣?

由於您在評論中說您的 Python 程序正在調用使用OpenMP的 C 模塊:

OpenMP 在一個進程內進行多線程處理,默認的線程數通常是 CPU 實際可以同時運行的數量。 (這通常是 CPU 內核的數量,如果 CPU 具有SMT功能,例如 Intel 的超線程,則是該數量的倍數。)因此,例如,如果您有一個四核非超線程 CPU,OpenMP 將想要默認運行 4 個線程。

當您使用 Python 的multiprocessing模塊時,您的程序會啟動多個可以同時運行的 Python 進程。 您可以控制進程的數量,但通常您希望它是 CPU 內核/線程的數量,例如multiprocessing.cpu_count()返回的數量。

那么,如果您運行一個運行 4 個 Python 進程的multiprocessing程序,並且每個進程調用一個 OpenMP 函數運行 4 個線程,那么在該四核 CPU 上會發生什么? 您最終會在 4 個內核上運行 16 個線程。 這會起作用,但不會達到最高效率,因為每個核心都必須花一些時間在任務之間切換。

設置OMP_NUM_THREADS=1基本上會關閉 OpenMP 多線程,因此您的每個 Python 進程都保持單線程。

但是,如果您這樣做,請確保您啟動了足夠的 Python 進程! 如果您有 4 個 CPU 內核並且只運行 2 個單線程 Python 進程,那么您將使用 2 個內核,而另外 2 個處於空閑狀態。 (在這種情況下,您可能需要設置OMP_NUM_THREADS=2 。)

在評論中解決:

OMP_NUM_THREADS 是 OpenMP 的一個選項,OpenMP 是一個 C/C++/Fortran API,用於在進程內執行多線程。
目前還不清楚這與 Python 多處理有何關系。
您的 Python 程序是否調用內部使用 OpenMP 的 C 語言編寫的模塊? – 威扎德

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM