我想知道是否有一種簡單的方法可以“打開”所有100%的CPU,以便我可以更快地運行進程(例如python計算)。
1)可以嗎?
2)是否有一種簡單的方法可以恢復到正常狀態?
3)是否可以使用較少的CPU
是否正在考慮進行命令行交互,例如:
pi @ raspberry:〜$ sudo turnOnFourCores python run.py
我想知道是否有一種簡單的方法可以“打開”所有100%的CPU,以便我可以更快地運行進程(例如python計算)。
1)可以嗎?
2)是否有一種簡單的方法可以恢復到正常狀態?
3)是否可以使用較少的CPU
是否正在考慮進行命令行交互,例如:
pi @ raspberry:〜$ sudo turnOnFourCores python run.py
默認情況下,任何計算機都將盡可能使用其所有內核。但是,只有在應用程序為多線程時,它才能實現此目的。如果不是(即不使用 threading
模塊的Python腳本),則它最多只能使用一個內核。這相當於四核CPU上CPU的25%。如果要修改腳本以使用多個內核,可以將計算分為多個部分,並對其進行多線程處理,如 Python文檔所示。
正如 Anon回答,如果不使用Python的GIL(全局解釋器鎖),它將無法正常工作。這允許任務同時(看似)運行,但不允許代碼跨多個內核運行。如果您使用的是用C語言編寫的模塊(例如numpy),則它們可以允許您使用多個內核來解決該限制。此外,如果不是這樣,Python將提供 multiprocessing,它允許您在多個內核上運行任何任務。
我想知道是否有一種簡單的方法可以“打開”所有100%的CPU,以便我可以更快地運行進程(例如python計算)。
不是我認為您是在暗示。這不是pi特有的問題,這是一個邏輯約束。
所有單獨的計算機當前沒有足夠的能力來確定某個進程作為單個線程運行可以並行運行。請注意,在他們可能具有此功能的時候,將不需要計算機程序員,因為可以執行此操作的計算機系統也可以編寫自己的代碼 1。 sup>。
考慮以下簡單的數學表達式:
(4 + 2)* 17 /(3 + 6)
可以並行計算,但在邏輯上受到限制。我會說沒有多於兩個線程是沒有意義的,即使那樣,它基本上只會是一個:
#1 a)4 + 2 b)6 * 17 c)102 / 9#2 a)3 + 6
線程#2通過計算3 + 6 = 9,由線程#1在步驟C中使用,節省了一步。但是,就並行性而言,這將是有益的。當線程#2 可以計算17/9時,#1執行6 * 17時,這樣做將毫無意義,因為您現在有兩個不同的路徑無法實現同一目標。即,#2可以繼續工作:
b)17/9 c)1.888 * 6
並最終得到與線程#1相同的結果(11.333),但是他們沒有在步驟A之外互相幫助,因此讓他們兩個追求這個目標是浪費時間。
(請注意,這個示例不是字面上的示例;它旨在演示邏輯原理。在用戶代碼中線程執行任務的規模要大得多,但是您無需在多線程編程中真正上課就可以掌握這裡的思想。)
利用多個處理器需要編寫相應的代碼。您不能簡單地說:“哦,使用所有4個內核,然後做得更快!”。那不會發生的。從邏輯上講,許多(或大多數)問題和任務涉及不能並行執行的步驟,它們必須順序執行。
1。但是請參見下面的Felix Dombek的評論;我不是AI方面的專家。值得一提的是,根據Peter Corde的評論,操作系統可以利用現代指令集和處理器以並行方式優化非常細粒度的事物,並且硬件管道也可以做到這一點,儘管不是跨內核的(單個內核正在進行的事情不止一件,在最終執行指令之前的不同時間對指令流進行操作)。我試圖在此處堅持用戶線程的主題,因為我認為這或多或少是您得到的。 sup>
使用多個內核需要將線程級並行性顯式地公開給OS,這通常需要程序員編寫多線程程序。 (或者在不同的輸入上多次運行單線程程序,例如使用 make -j4
進行編譯)
某些語言的編譯器支持自動並行化。例如,具有OpenMP的C或C ++可以將普通的 for()
循環編譯到啟動多個線程的程序中。
#pragma omp parallel forfor(int i = 0; i < 1000000; ++ i){A [i] = B [i] *常數+ C [i];}
但是,在您編寫時,這必鬚髮生或編譯程序。 當前的硬件和操作系統無法使用多個內核來加速單線程程序。
相關:單線程如何運行在多個內核上?:答案是:不是。但是還有其他種類的並行性,例如指令級並行性,單個CPU內核發現並利用該並行性運行單個線程的速度比一次執行一條指令快。
我的回答關於這個問題的細節涉及現代CPU如何查找和利用細粒度的指令級並行性的一些細節。 (主要關注x86)。通過同時運行多個指令,這只是正常CPU工作方式的一部分,而無需特別啟用。 (不過,有一些性能計數器可以讓您查看CPU在執行程序時每個時鐘設法運行多少條指令,或者採取其他措施。)
請注意,RPi3使用有序 ARM Cortex-A53 CPU內核。每個內核都是2寬的超標量(ILP允許,每個時鐘2條指令),但是不能對指令重新排序以找到更多的指令級並行性並隱藏延遲。
儘管如此,CPU是流水線化的,所以正在運行的指令總數(從獲取和解碼一直到流水線末尾的寫回階段)非常重要。當數據依賴性不受限制時,CPU正在處理的每個管道階段可以有2條指令,每個時鐘的吞吐量為2條指令。 (這是2-wide的意思。)
它不能無序地執行指令,但是通過謹慎的指令排序(通常由編譯器執行),它仍然可以隱藏需要多個週期的指令的延遲。準備好輸出。 (例如,即使加載到緩存中或多次加載,加載也要花費多個週期,而下一個週期要準備好加法)。技巧是對asm指令進行排序,以便在生成結果的那一條與使用結果的那一條之間有多個獨立的指令。可以在內部重新排序,同時保留以程序順序運行的錯覺。對於編譯器來說,即使是很小的無序窗口也很難很好地完成指令的重新排序,因為緩存丟失是不可預測的,並且在編譯時很難分析跨函數調用的依賴鏈。沒有硬件寄存器重命名的情況下,寄存器的數量是有限的。
當您的代碼運行速度比您想要的慢時,所有這些都會帶來很小的舒適感。當然,Cortex-A53的引擎蓋下有很多很酷的東西,但 Cortex-A57的引擎蓋下還有很多很酷的東西(例如每個命令最多無序執行3條指令)時鐘),甚至在像Skylake這樣的大型x86 CPU中更是如此(更不用說時鐘速度差異了。)
與 https://en.wikipedia相比,Cortex-A53真是太棒了.org / wiki / Classic_RISC_pipeline就像您在計算機體系結構類中學習的原始MIPS一樣,但是按照現代標準,它是相當低端的。
這根本不是CPU的工作方式。
按照目前的狀態,假設您的CPU不會由於溫度相關的問題而受到限制,那麼它完全能夠以100%的使用率運行在攝氏80度或以上。話雖這麼說,您(通常)不想看到CPU固定在100%。如果您的CPU利用率通常為100%,則處理器可能要處理的過多。這會造成結結,並給用戶帶來普遍不愉快的體驗。這輛車可能能夠以每小時100英里的速度行駛,但是您的車速表很有可能會在該速度下讀取一些東西。在城裡時,您可能永遠無法達到每小時25英里的速度。但是這並不能改變汽車可以以每小時100英里的速度行駛。您只是沒有足夠地用力推動加速器。
如果僅使RPi做更多的事情(在加速器上施加更多的推動力),您將看到CPU利用率上升。例如,在終端窗口中運行命令 yes
時,請注意CPU的使用情況(請記住, ctrl + c
會終止終端命令)。這將使您的CPU增加25%,因為它將使您的四個CPU內核之一最大化。
其他答案確實提供了詳細的信息,但似乎並沒有專門解決您的問題。
NB:
如果要提高pi的整體性能,則可能需要研究Overclocking。這樣可以使CPU以更快的速度運行。缺點是發熱量增加,處理器壽命降低以及功耗增加。
如果可能的話,我將參數化腳本並在單獨的Python進程中執行它們。例如:
cat parameters.txt | xargs -n1 -P4 python run.py
另一種選擇是已經提到的多處理庫,該庫允許您分叉並加入python進程。但這還要求您具有要為其運行計算的參數列表(例如文件名)。
如果要測試RPI。您可以像在此處中那樣運行 stress
,然後您可以查看如何將CPU與 htop
一起使用。這很有用,因為您可以查看電源是否足夠,如果不夠,則RPI將嘗試使用過多的電流(安培),並且將關閉。
另一方面,如果您要使用python腳本,您應該看到 joblib
,當您要並行化進程時,該函數非常有用,因此您將使用所需的處理器數量。
我認為OP可能無法完全理解多核/多線程編程的概念以及如何充分利用100%的多核有多困難,除非可以輕鬆地將該算法製成令人尷尬的並行 >問題。
有關更多信息,您可以閱讀有關著名文章“免費午餐結束”的更多信息。 http://www.gotw.ca/publications/concurrency-ddj。 htm
儘管所有這些答案在不同方面都是正確的,但確實操作系統將自動使用不同的內核來分散負載。您可以使用簡單的python程序(temp.py這樣說)
True:x = 1.0
從RPi桌面打開一個終端,然後鍵入 $ top
將顯示處理器的工作。然後打開另一個終端並 python3 temp.py
,您將看到python3作業的處理器時間增加了100%。然後打開另一個終端並重複該過程,看看如何提高到400%。因此,在@Shadow註釋的一級上,它是如此簡單,並且它是默認設置。但是,正如其他人所解釋的那樣,設計可以使用並行處理的程序並非易事。
答案是肯定的!您只需編寫程序即可識別它們並使用它們。這樣做的程序可以使用內核。我用Java編寫了代碼,因此可以。
Python開發人員提供的上述答案對該答案的概念非常有限,因此可能會非常令人困惑,但是答案是“是”,只有“是”!
由於OP在他的問題中未指定python,所以我想建議另外兩種在Raspberry Pi上都能正常工作並且使用並發性非常簡單的現代語言。
我目前最喜歡的是Rust語言。我已經在Pi上編寫和編譯了程序。 Rust很不錯,因為它可以防止多種類型的指針和競爭條件錯誤,這使得編寫並發代碼既容易又安全。 Rust原本是一種系統編程語言,但是它幾乎可以執行C可以做的任何事情。 Go是由Google團隊創建的,是一種相當成熟的語言。在Go中創建協程很容易,他們稱之為“ Go例程”。
這兩種語言都可以在Raspberry Pi甚至Pi Zero上編譯代碼。但是,它們都可以從速度更快的計算機進行交叉編譯,這對於大型程序來說很不錯。