我有一個 Ubuntu 伺服器,有 16 個 CPU。 (nproc --all
給我看看16
)
我寫了一個 bash 腳本,名稱test.sh
如下:
#!/bin/bash
while :
do
echo xxx
done
我執行了它:./test.sh >/dev/null &
.
然後我用指令top
監控cpu使用情況,發現一個cpu已經被使用了幾乎100%,因為這個進程test.sh
:
6411 me 20 0 11240 3052 2852 R 93.8 0.0 0:11.71 test.sh
%Cpu5 : 96.7 us, 3.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
我們可以看到,該進程test.sh
已被分配到第5個CPU上,該CPU的利用率幾乎為100%。
是否可以將繁重的進程分配到多個 CPU 上,以便我們可以更多地利用 CPU?為什麼作業系統不將進程分配test.sh
到多個CPU上?是因為進程test.sh
不夠重還是我們應該對作業系統進行一些配置來做到這一點?
答案1
單一執行緒不能在多個核心之間拆分:
需要編寫一個程式來擁有多個執行緒(每個核心一個),或需要多個程式。如果沒有,那麼您將不會使用核心。
編寫程式以使用更多核心並不是一件小事,而且並非所有問題都可以並行化(編寫為在多個核心上運行)。如果一個問題包含 20% 本質上順序的程式碼,那麼對於無限數量的處理器,它的速度不會比原始執行時間快 20%(速度增加 500%)。然後是開銷(執行緒之間的通訊)。
如果您沒有任何核心應用程序,那麼您最好將其出售,並購買更便宜的機器。
每個核心都會有大量的並行性,來處理單一線程,但這是不可見的。現在,隨著我們添加內核,我們正在努力使單一內核變得更快。一開始這很有效。
Unix 系統(例如 Gnu/Linux,例如 Ubuntu),在使用額外核心方面做得很好,最多約 2→4 個。當您擁有一個用於病毒掃描程式的核心、一個用於碎片整理程式的核心以及一個用於其他所有功能的核心時,Microsoft 的 Windows 就會得到改進。
之後,只有當您擁有專為多核心設計的應用程式時,它才會產生影響。
答案2
以下是可以使用多個處理器的 Linux 命令的範例:
make -j
gcc -pipe
當使用 編譯大型專案時,該make
選項特別有用且簡單gcc
。
-fopenmp
當您呼叫 gcc 時,將該選項新增至您的建置選項。嘗試在 for 迴圈上方新增以下編譯指示:
#pragma omp parallel for for(i=0; i<8000000000; i++) { ptr[i] = i/10000; }
預設情況下,OpenMP 將在您的電腦中建立與核心一樣多的線程,並在它們之間平均分擔工作負載。