說到需要什麼方面的知識,我覺得和一個隊伍要達到的目標相關。個人認為目標可以分為三檔,由易到難。三個目標分別是
能順利在叢集上執行比賽要跑的程式。
能夠理解應用背後的理論知識。
能夠利用應用的背景知識和計算機的知識去最佳化應用(主要是程式碼層面)。
要達到第一個目標,首先需要掌握最基礎的 1)搭建叢集知識(大致可以等價於Linux運維)和 2)程式編譯和執行的知識。搭建叢集簡單來說就是安裝Linux系統,配置好網路(乙太網和InfiniBand),然後安裝一些必要的軟體包(比如CUDA,Intel Parallel Studio)等。這些網上應該有很多資料,對於CUDA和InfiniBand什麼的最好讀一讀安裝文件(俗話說得好,read the f*cking menu)。編譯和執行主要是指明白怎麼用編譯器編譯、連結,怎麼做一些簡單的最佳化,編譯出了錯誤怎麼解決,怎麼執行MPI或者OpenMP程式等。掌握了這些基礎知識,應該最起碼可以順利地跑起來比賽的各個應用並作適當的最佳化。
要達到第二個目標,主要就是數學知識。大部分參賽應用背後都是線性代數,偏微分方程等等。如果有一些數學基礎的話,大致理解應用的原理應該不是太難(量子化學等除外)。知道了這些可以更好的去除錯程式執行的引數,達到更好的精度或者更快的速度。
要達到第三個目標,主要是靠積累。程式碼最佳化這個東西能做的實在是太多了,每個應用能做的也不一樣,沒有固定的套路,所以主要是靠平日的積累(在這看點在那看點就積累下來了,也沒有一個什麼最佳化大全這樣的東西,畢竟涉及的面太廣)。單獨針對一個應用來說的話,可以讀一些應用相關的論文,搜尋引擎直接搜可能搜不到什麼有用的。
如果說學習的書和資料的話,你可以順著我講的去搜一下每個方向有什麼好的資料推薦。入門的話簡單瞭解就好,不用一個方向扣的太深。我個人並沒什麼特別突出的書推薦,我們隊也沒有什麼公認的教材什麼的,主要是涉及的東西真得是太散了。
說到需要什麼方面的知識,我覺得和一個隊伍要達到的目標相關。個人認為目標可以分為三檔,由易到難。三個目標分別是
能順利在叢集上執行比賽要跑的程式。
能夠理解應用背後的理論知識。
能夠利用應用的背景知識和計算機的知識去最佳化應用(主要是程式碼層面)。
要達到第一個目標,首先需要掌握最基礎的 1)搭建叢集知識(大致可以等價於Linux運維)和 2)程式編譯和執行的知識。搭建叢集簡單來說就是安裝Linux系統,配置好網路(乙太網和InfiniBand),然後安裝一些必要的軟體包(比如CUDA,Intel Parallel Studio)等。這些網上應該有很多資料,對於CUDA和InfiniBand什麼的最好讀一讀安裝文件(俗話說得好,read the f*cking menu)。編譯和執行主要是指明白怎麼用編譯器編譯、連結,怎麼做一些簡單的最佳化,編譯出了錯誤怎麼解決,怎麼執行MPI或者OpenMP程式等。掌握了這些基礎知識,應該最起碼可以順利地跑起來比賽的各個應用並作適當的最佳化。
要達到第二個目標,主要就是數學知識。大部分參賽應用背後都是線性代數,偏微分方程等等。如果有一些數學基礎的話,大致理解應用的原理應該不是太難(量子化學等除外)。知道了這些可以更好的去除錯程式執行的引數,達到更好的精度或者更快的速度。
要達到第三個目標,主要是靠積累。程式碼最佳化這個東西能做的實在是太多了,每個應用能做的也不一樣,沒有固定的套路,所以主要是靠平日的積累(在這看點在那看點就積累下來了,也沒有一個什麼最佳化大全這樣的東西,畢竟涉及的面太廣)。單獨針對一個應用來說的話,可以讀一些應用相關的論文,搜尋引擎直接搜可能搜不到什麼有用的。
如果說學習的書和資料的話,你可以順著我講的去搜一下每個方向有什麼好的資料推薦。入門的話簡單瞭解就好,不用一個方向扣的太深。我個人並沒什麼特別突出的書推薦,我們隊也沒有什麼公認的教材什麼的,主要是涉及的東西真得是太散了。