2014-02-20 87 views
0

我有一個opencv庫的C++程序,它將圖像作爲輸入並執行姿態估計,顏色檢測,phog。當我從命令行運行該程序時,大約需要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)有沒有辦法解決這個問題的任何想法或提示?

運行時,一個進程,並在同一時間運行在同一進程兩次我已經插入頂部的結果:

版本5的過程中,運行它 enter image description here 兩個版本5次發生在同一時間運行 enter image description here

的CPU信息: enter image description here

在此先感謝。

+0

沒有實際(優化代碼本身之後當然)你是否接受,CPU使用率過高或更長的執行時間看到你的代碼,很難確切地說代碼在做什麼......但似乎有點懷疑。 –

+0

這也將有助於理解你的CPU是什麼。例如,英特爾超線程處理器的行爲與具有「四個真實內核」的處理器的行爲不同。 –

+0

我已經添加了我的CPU細節。 – user1583647

回答

2

變焦,使您的照片幾乎佔據了我的整個22" 後的屏幕,我可以做出來的是,CPU標誌顯示‘HT’,意思是‘超線程’,所以你實際上只有兩個真正的核心,這是間共享兩個超線程,所以同時運行在所有四個CPU內核上的性能不會像在兩個真正的內核上運行一樣

換句話說,「性能損失」完全如您所料,因爲您擁有四線程爭取兩個CPU內核的實際計算資源超線程有助於代碼有很多可以通過運行第二個線程「隱藏」的內存交互但是如果你有一個CPU密集型代碼,那不是「在緩存中不存在「,那麼獲得的收益就會少得多,而在極端情況下,則會增加線程實際上會導致速度變慢(因爲一個線程中的代碼會破壞緩存,否則會妨礙第一個線程)。您可能需要進入BIOS設置並關閉超線程並比較結果。當然,運行代碼的兩個實例顯然仍然需要更長的時間,但問題是「是否比超線程運行更長時間」 - 不幸的是,無法確定從理論角度來看哪個更好(即使我可以看到彙編代碼並理解了內存訪問模式 - 沒有這種詳細程度,完全不可能判斷)。

1
  1. 當運行只有一個進程達到60%的CPU使用率時,使用多線程可能會加快執行速度。但是,CPU使用率可能會更高
  2. 的確如此。上下文切換可能會有額外的開銷(多任務處理)
  3. 更改函數可以帶來一些改進,但沒有代碼就很難說。
  4. 由於計算工作量是很高,我認爲你必須決定

格爾茨