我在程序開始時使用OpenMP進行並行排序。數據加載和排序後,程序將作爲守護進程運行,並且不再使用OpenMP。有沒有辦法關閉由OpenMP創建的空閒線程? omp_set_num_threads()不會影響已爲任務創建的空閒線程。有沒有辦法在GNU OpenMP中結束空閒線程?
回答
理論上,OpenMP在「編譯指示」子句的最後有一個隱含的同步。因此,當OpenMP並行工作結束時,所有線程都將被刪除。你不需要殺死它們或釋放它們:OpenMP自動執行它。
也許「omp_get_num_threads()」告訴你程序的實際配置,而不是活動線程的數量。我的意思是:如果將線程數設置爲4,omp會告訴您配置是「4個線程」,但這並不意味着實際上有4個線程正在處理中。
Uhm,no,'omp_get_thread_num'告訴你當前的線程號,而不是當前正在執行的線程的數量,也不是允許的最大線程數。 – Mehrdad 2015-02-09 04:17:28
我不認爲它殺死了線程。線程在線程池中創建,以便在需要時再次使用。這減少了在並行區域之間創建和刪除線程的常常很大的開銷。 – 2015-02-09 07:37:44
已編輯(我想說「omp_get_num_threads」,而不是「thread_num」 – 2015-02-09 21:52:46
我不相信有一種方法來觸發線程的破壞。現代OpenMP實現傾向於保持池中的線程以加速開始未來的並行部分。
在你的情況下,我會推薦一個兩個程序解決方案(一個並行排序和一個守護進程序列)。您如何在它們之間傳遞數據取決於您。你可以做一些簡單的事情,比如把它寫到一個文件然後再讀一遍。這可能不像聽起來那麼慢,因爲現代Linux發行版可能會將該文件保留在文件緩存中的內存中。
如果您確實想確保它保留在內存中,可以同時啓動這兩個進程並允許它們共享內存,並在完成後允許第一個並行排序過程退出。
請查閱OpenMP 4中新增的OMP_WAIT_POLICY [https://gcc.gnu.org/onlinedocs/libgomp/OMP_005fWAIT_005fPOLICY.html]。
如果您的OpenMP實施不夠近,那麼還有像GOMP_SPINCOUNT這樣的非可移植替代方案。我記得在OpenMP規範討論中,至少Intel,IBM,Cray和Oracle已經支持他們自己實現這個功能。
- 1. OpenMP,VTune,空閒線程
- 2. OpenMP(C)空閒線程的狀態
- 3. 有沒有辦法在RAML中標記方法的結束?
- 4. 有沒有辦法看到Android上有多少內存空閒?
- 5. 有沒有辦法在AnimatedVectorDrawables中偵聽動畫結束
- 6. 有沒有辦法檢查用戶目前是否空閒?
- 7. 有沒有辦法檢測python程序何時結束?
- 8. 有沒有辦法去QUEUE線程?
- 9. 有沒有辦法多線程的SqlDataReader?
- 10. 運行tkinter應用程序時,有沒有辦法隱藏空閒IDLE?
- 11. 線程沒有結束/超時
- 12. 有沒有辦法從片段中結束片段?
- 13. 有沒有辦法檢測滾動開始和結束在TreeView?
- 14. iPhone:有沒有辦法在視頻結束之前退出MPMoviePlayerController?
- 15. 有沒有辦法在gnu中打印最終消息
- 16. 有沒有辦法在GNU屏幕中自動分割屏幕?
- 17. 有沒有辦法在輸出中結合命名空間?
- 18. 過程中,所有線程都結束了沒有完成
- 19. 有沒有辦法在進程結束時對靜態成員做些什麼?
- 20. 有在空閒
- 21. OpenMP遞歸比沒有線程慢
- 22. 與openMP沒有並行線程
- 23. 有沒有辦法在python中重新使用線程工作?
- 24. 有沒有辦法在多個線程中使用asyncio.Queue?
- 25. 有沒有辦法通過設置開始和結束向量
- 26. 有沒有辦法知道ExecutorService是否成功結束?
- 27. 有沒有辦法檢查下一個令牌是否結束?
- 28. 有沒有辦法驗證沒有線程阻塞?
- 29. 沒有空閒子進程連接
- 30. iOS中的空閒線程方法
你有一些代碼嗎?你使用哪種編程語言? – 2015-02-08 22:58:17
爲什麼這很重要?這如何影響你? – 2015-02-09 07:38:30
這很重要,因爲我最終得到了大量的空閒線程。我爲系統的每個核心運行我的守護程序的副本。在典型的現代硬件中,它是48個內核,所以我有2300個空閒的OpenMP線程無所事事。我需要OpenMP來加速重啓,我很少重新啓動所有的實例。這一點也很重要,因爲這些線程使用coredumps進行問題分析變得複雜。 – Kostja 2015-02-09 15:35:46