高通量計算框架HTCondor(四)——案例準備

  • 2020 年 1 月 31 日
  • 筆記

目錄

1. 正文

1.1. 任務劃分

使用高通量計算第一步就是要針對密集運算任務做任務劃分。將一個海量的、耗時的、耗資源的任務劃分成合適粒度的小任務,需要綜合考慮資源、數據等多方面因素。HTCondor並不參與這方面的工作,任務劃分需要用戶自己實現。

默認情況下,HTCondor會把一個CPU核心當成一個計算資源。最理想的情況,就是計算集群網路內所有的集群主機都是同樣的配置,數據也是易於劃分的,那麼可以按照電腦集群內CPU的總核心數,對數據量等分劃分。這樣,因為同樣的數據量同樣的電腦資源,進行分散式計算時理論上會同時完成,也就達到了負載均衡。

這裡就準備了這樣的一個任務例子,假設任務已經劃分好,已經放到同一個目錄中:

0,1,2,…, 15就是劃分好的16份數據,每個目錄中都存放了數據。所謂計算任務,就是輸入一個數據,處理後形成新的數據。所以,每個文件夾都放入了一個input.txt文件,作為計算任務的輸入:

實例目的很簡單,就是將這些劃分好的任務提交到HTCondor,讓HTCondor的計算資源分別處理這些數據,並將新的數據返回來。

1.2. 任務程式

既然要進行計算任務,那麼不可或缺的就是運行的任務程式了。說到底分散式計算的基礎還是單機運算,必須要保證發送的每個任務在單機下就能正確運行,才能談任務調度的問題。

在這裡我用的是一個C/C++的任務程式:

#include <iostream>  #include <fstream>  #include <string>  #include <time.h>    using namespace std;    int main()  {      fprintf(stdout, "開始運行n");        //延時10S      fprintf(stdout, "延時10Sn");      time_t first = time(NULL);      double diff = 0;      while (diff<10)      {          time_t second = time(NULL);          diff = difftime(second, first);         //計時      }        ifstream infile("input.txt");      if (!infile)      {          fprintf(stderr, "無法讀取文件n");          return 1;      }        string line;      getline(infile, line);          ofstream outfile("output.dat");      if (!outfile)      {          fprintf(stderr, "無法寫出文件n");          return 1;      }        outfile << "輸出內容:n";      outfile << line;        fprintf(stdout, "運行完成n");        return 0;  }

可以看到這個程式特別簡單,就是延時10秒後,讀取input.txt的內容,寫出到output.dat中。延時10秒是為了方便顯示運行狀態。其實不必非要C/C++的程式,只要是能夠運行的可執行程式即可,條件是每台機器要有對應的運行環境,否則發送過去的任務會因為無法運行而掛起。

將這個程式編譯的可執行程式放到bin目錄中,保證在單機的情況下,能夠正常運行。

在下一章中,將會介紹如何通過HTCondor框架運行這個實例。

2. 相關

程式碼和數據地址

上一篇 目錄 下一篇