天天看點

《高性能科學與工程計算》——3.2 存儲順序

本節書摘來自華章計算機《高性能科學與工程計算》一書中的第3章,第3.2節,作者:(德)georg hager gerhard wellein 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

多元數組、矩陣或者類矩陣結構(最重要),在科學計算中無處不在。資料通路是一個關鍵的問題:标準計算機所固有的一維、基于cache行的記憶體布局和任何多元資料結構間的映射必須與資料讀取與存儲的順序相比對,這樣才能充分利用空間和時間局部性。一維數組的非連續訪存會減少空間局部性,進而導緻訪存帶寬使用率的低效(見習題3.1)。當處理多元數組時,這些訪存模式可以很自然地産生。

《高性能科學與工程計算》——3.2 存儲順序

https://yqfile.alicdn.com/deee056f0c677b77e33166ab7f05e0460cd801a4.png" >

上面的fortran和c代碼示例執行相同的任務,數組的二維索引也都位于内層循環,但是兩者的資料訪存模式完全不同:fortran代碼的記憶體位址的通路跨度為n*sizeof(double),c代碼的記憶體位址的通路跨度是最優的(訪存跨度為1)。這是因為對于多元矩陣在c語言中是按行存儲(見圖3-3),而在fortran語言中是按列存儲(見圖3-4)。這在進行資料通路優化時必須要牢記:當内層循環變量作為多元數組索引時,應該保證跨度為1的資料通路模式。3.4節将詳細讨論如何實作。

《高性能科學與工程計算》——3.2 存儲順序

https://yqfile.alicdn.com/b20eec88d0654cd708637ead524b8df712d70cd6.png" >

《高性能科學與工程計算》——3.2 存儲順序