一、hdf5數據庫的并行讀寫是怎么回事
關鍵點在于告知數據位置(hyperslab)。比如說我要把我100*100的矩陣分成10*10的block,我需要告訴代碼我的分配規則。比如說,rank0 寫在名列前茅行名列前茅列,rank1寫在名列前茅行第二列,我就可以寫col=rank%10,row=rank/10,(從0計數),寫的時候每個processor會告知,mydata,myrank,myposition,然后并行的時候每個核的數據就會被寫在相應的位置。
給個fortran的例子,
CALL h5sselect_hyperslab_f (filespace, H5S_SELECT_SET_F, offset, count, error, stride,block_size)
這里filespace 告知在文件里開辟的內存id,第二個內置參數,告訴怎樣寫,后面offset,count,stride,block什么的全都用于描述位置,你可以橫著寫,數著寫,跳著寫,轉著圈寫。。。一般我只用兩個參數就能描述清楚了,因為我搞的是結構網格,一開始還不理解為什么那么多種寫數據的花型。直到后面寫作業用到非結構網格,這個時候描述數據位置就尤其重要了,因為你需要讓相鄰processor處理的數據物理空間也盡量靠近,這樣才能減少block之間的信息交互,然后提高計算速度。
延伸閱讀:
二、并發鎖
在一定條件下,MyISAM也支持查詢和操作的并發進行。
MyISAM存儲引擎有一個系統變量concurrent_insert,專門用以控制其并發插入的行為,其值分別可以為0、1或2。
當concurrent_insert設置為0時,不允許并發插入。
當concurrent_insert設置為1時,如果MyISAM允許在一個讀表的同時,另一個進程從表尾插入記錄。這也是MySQL的默認設置。
當concurrent_insert設置為2時,無論MyISAM表中有沒有空洞,都允許在表尾插入記錄,都允許在表尾并發插入記錄。
可以利用MyISAM存儲引擎的并發插入特性,來解決應用中對同一表查詢和插入鎖爭用。例如,將concurrent_insert系統變量為2,總是允許并發插入;同時,通過定期在系統空閑時段執行OPTIONMIZE TABLE語句來整理空間碎片,收到因刪除記錄而產生的中間空洞。