2015-02-08 79 views
1

我在程序開始時使用OpenMP進行並行排序。數據加載和排序後,程序將作爲守護進程運行,並且不再使用OpenMP。有沒有辦法關閉由OpenMP創建的空閒線程? omp_set_num_threads()不會影響已爲任務創建的空閒線程。有沒有辦法在GNU OpenMP中結束空閒線程?

+0

你有一些代碼嗎?你使用哪種編程語言? – 2015-02-08 22:58:17

+0

爲什麼這很重要?這如何影響你? – 2015-02-09 07:38:30

+0

這很重要,因爲我最終得到了大量的空閒線程。我爲系統的每個核心運行我的守護程序的副本。在典型的現代硬件中,它是48個內核,所以我有2300個空閒的OpenMP線程無所事事。我需要OpenMP來加速重啓,我很少重新啓動所有的實例。這一點也很重要,因爲這些線程使用coredumps進行問題分析變得複雜。 – Kostja 2015-02-09 15:35:46

回答

0

理論上,OpenMP在「編譯指示」子句的最後有一個隱含的同步。因此,當OpenMP並行工作結束時,所有線程都將被刪除。你不需要殺死它們或釋放它們:OpenMP自動執行它。

也許「omp_get_num_threads()」告訴你程序的實際配置,而不是活動線程的數量。我的意思是:如果將線程數設置爲4,omp會告訴您配置是「4個線程」,但這並不意味着實際上有4個線程正在處理中。

+0

Uhm,no,'omp_get_thread_num'告訴你當前的線程號,而不是當前正在執行的線程的數量,也不是允許的最大線程數。 – Mehrdad 2015-02-09 04:17:28

+2

我不認爲它殺死了線程。線程在線程池中創建,以便在需要時再次使用。這減少了在並行區域之間創建和刪除線程的常常很大的開銷。 – 2015-02-09 07:37:44

+0

已編輯(我想說「omp_get_num_threads」,而不是「thread_num」 – 2015-02-09 21:52:46

1

我不相信有一種方法來觸發線程的破壞。現代OpenMP實現傾向於保持池中的線程以加速開始未來的並行部分。

在你的情況下,我會推薦一個兩個程序解決方案(一個並行排序和一個守護進程序列)。您如何在它們之間傳遞數據取決於您。你可以做一些簡單的事情,比如把它寫到一個文件然後再讀一遍。這可能不像聽起來那麼慢,因爲現代Linux發行版可能會將該文件保留在文件緩存中的內存中。

如果您確實想確保它保留在內存中,可以同時啓動這兩個進程並允許它們共享內存,並在完成後允許第一個並行排序過程退出。

相關問題