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, "延時10S\n");
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框架運行這個實例。