Monday, December 09, 2013

關於平行化的NetCDF

之前一直都搞混了...

NetCDF是地球科學常用的一個檔案格式, 搭配有一整套library可以去讀寫.
但是這種檔案通常都很大, 又經常用在平行運算, 所以有人想到要把NetCDF平行化.
目前有兩種平行化的NetCDF, 花了點時間才搞清楚...
在這裡要先說明, NetCDF目前其實有兩種API
一種稱作Classic NetCDF, 另一種新的叫NetCDF-4.
目前的版本預設是兩種都會裝, 但是NetCDF4底層透過HDF5 (另一種多階層資料格式) 來做儲存, 所以如果編的時候偵測不到HDF5, 就不會安裝NetCDF4. 當然也可以下 --disable-netcdf-4 手動關閉.

在Classic NetCDF的部分, 是用西北大學跟Argonne國家實驗室的parallel NetCDF來實作平行化.
它重寫原來NetCDF的函數, 增加平行化的部分.
而parallel NetCDF是利用MPIO去做平行化, 所以它只有depend on MPI.
然後在編NetCDF時, 要下--enable-pnetcdf
這樣會去把parallel NetCDF拉進來做連結.

要注意的是, 因為parallel NetCDF只會做出static library, 後面NetCDF要做shared library時, 也要去連這個static parallel NetCDF, 所以編parallel NetCDF時必須加上CFLAGS=-fPIC, 否則後面NetCDF會連結失敗.

新的NetCDF-4 利用HDF5做底層儲存.
而HDF5本身是支援MPIO的, 所以如果在編譯HDF5時開啟了平行化選項,
去跟它連結的NetCDF-4也會(透過HDF5)擁有平行化的能力.
這部分不用另外下參數, 只要他偵測到HDF5有啟用MPIO, 就會自動把這個功能編進去.

以上的這兩種做法是不相同的, 而且可以單獨或同時使用.
補充: 剛剛重作的測試, NetCDF在--disable- netcdf-4 時, 也會同時強制關閉--enable-pnetcdf.
所以要使用pnetcdf就一定要安裝NetCDF-4/HDF5.

No comments: