如何在兩個CPU上分配一個進程

如何在兩個CPU上分配一個進程

我有一個 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 將在您的電腦中建立與核心一樣多的線程,並在它們之間平均分擔工作負載。

相關內容