簡體   English   中英

同時運行一個進程多次

[英]Running a process multiple times at the same time

我有一個帶有opencv庫的c ++程序,該庫將圖像作為輸入並執行姿勢估計,顏色檢測,模糊。 當我從命令行運行該程序時,大約需要4-5秒才能完成。 大約需要60%cpu。 當我嘗試同時從兩個不同的命令行窗口運行同一程序時,該過程大約需要10到15秒才能完成,並且兩個過程幾乎都在同一時間完成。 CPU使用率達到100%。

我有一個使用exec()命令調用此c ++ exe的網站。 因此,當兩個用戶嘗試上載圖像並運行時,如上面在命令行中所述,它花費了更多時間。 這是因為c ++程序涉及大量計算並且CPU達到100%時它會變慢嗎? 但是我讀到CPU達到100%並不是一件壞事,因為計算機正在使用其全部容量來運行程序。 那是因為我的C ++程序還是與服務器(計算機)設置有關? 這可能不是apache服務器的問題,因為當我嘗試從命令行運行它時,它也會變慢。 我使用的是四核處理器,當我嘗試同時運行同一進程時,所有4個CPU都達到100%,因此我認為它分布在所有處理器中。 所以我還有幾個問題:

1)可以在我的C ++代碼中使用多線程解決嗎?目前我不使用它,但是多線程會使C ++代碼在計算上更加昂貴並增加CPU使用率(如果這是問題所在)。

2)它變慢的原因可能是什么? 進程是否在隊列中,並且每個進程只運行了一定的時間,並且在兩個進程之間切換?

3)如果這是因為它涉及大量的計算,如果我將某些函數更改為opencv gpu函數會有所幫助嗎?

4)有什么辦法可以解決這個問題嗎?

當運行一個進程並同時運行同一進程兩次時,我已插入top的結果:

版本5是該過程,僅運行一次 在此處輸入圖片說明 同時運行兩個Version5 在此處輸入圖片說明

CPU信息: 在此處輸入圖片說明

提前致謝。

縮放后,您的圖片幾乎占據了整個22英寸的屏幕,我可以看出CPU標志顯示為“ ht”,這意味着“超線程”,因此您實際上只有兩個真正的內核,兩個超線程之間共享。一次在所有四個CPU內核上運行不會提供與在兩個真正的內核上運行相同的性能。

換句話說,“性能損失”完全符合您的預期,因為您有四個線程在爭奪兩個CPU內核的實際計算資源。 如果代碼具有大量可以通過運行第二個線程“隱藏”的內存交互,則超線程會有所幫助。 但是,如果您有占用大量CPU的代碼,而不會“大量丟失”在高速緩存中,那么收益就少得多,在極端情況下,超線程實際上會導致速度變慢(因為一個線程中的代碼會破壞高速緩存)否則“妨礙”了第一個線程)。 您可能需要嘗試進入BIOS設置並關閉超線程,然后比較結果。 當然,運行代碼的兩個實例顯然仍然需要更長的時間,但是問題是“它比使用超線程運行的時間更長嗎?”-不幸的是,從理論上講,無法確定哪個更好(即使我可以看到匯編代碼並了解內存訪問模式-如果沒有這種詳細程度,則完全不可能判斷)。

  1. 當僅運行一個進程達到CPU使用率的60%時,使用多線程可能會加快執行速度。 但是,CPU使用率可能會更高
  2. 確實如此。 上下文切換(多任務)可能會有額外的開銷
  3. 更改功能可以帶來一些改進,但是如果沒有代碼,很難說。
  4. 由於計算量很大,因此我認為您必須決定是否接受高CPU使用率或更長的執行時間(當然是在優化代碼本身之后)

格蕾茲

暫無
暫無

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

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