Re: [問題] fortran 一維矩陣

看板Fortran作者 (如果狗狗飛上天)時間10年前 (2014/12/19 04:19), 編輯推噓2(2016)
留言18則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《kuang01 (我叫小劉)》之銘言: : 想請問各位大大 : 在fortran 一維矩陣裡 : do i=1,5 : A(i)=2 : enddo : 這樣會是 一colum vector 還是 row vector : 因為我在matlab裡 : 如果把 do 換成for : 這樣去寫 會出現 row vector : 想請問 fortran 的一維跟matlab是否不太一樣 底下的人回答大致正確,因為對指標上來說,確實沒差別, 但是你有這種問題,甚至刻意的去區別到底一個一維陣 列是row還是column vector也不是壞事. 因為在記憶體的使用上,fortran確實是by column,而C based的語言,例如C/C++,Matlab,Scilab,Python都是 by row.也就是說,當你往記憶體裡面填入一個二維陣 列時,fortran會讓同一個column的資料作連續的排列. 因此當你在記憶體裡面填值或讀值的時候,在fortran應 該要先作column vector,而Matlab,C/C++,Python等應該要 先做row vector,在記憶體的使用上才是連續的讀寫,不會 一直跳躍. 這個影響還不只是讀寫效率的問題,那還只是其次的,作 不好頂多效率比較低,但是當你要讓by column跟by row 的語言相互傳值時,問題才出現. 例如你想在C-based的語言裡面使用fortran寫成的library, 例如lapack.因為你會把C裡面的一塊記憶體傳到fortran中, 但因為C是將同一個row的資料在記憶體中作連續排列,跟 fortran對記憶體的使用方式剛好相反,所以當你把資料傳入 時,fortran在理解這個陣列時,行列都會顛倒了.所以當你要 把C裡面的值傳到fortran時,往往需要先轉秩才能傳入.反之 亦然. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 168.150.122.1 ※ 文章網址: http://www.ptt.cc/bbs/Fortran/M.1418933953.A.2EE.html

12/19 17:57, , 1F
Matlab是column-major。
12/19 17:57, 1F

12/19 17:58, , 2F
話說雖然一般認知都當做Fortran是column-major,但是
12/19 17:58, 2F

12/19 17:58, , 3F
在標準書中似乎沒有此規範,會是約定俗成或是取決於
12/19 17:58, 3F

12/19 17:59, , 4F
實做嗎?
12/19 17:59, 4F

12/19 23:23, , 5F
是因為Fortran實際存array記憶體是以colume major方式去存
12/19 23:23, 5F

12/19 23:24, , 6F
所以才會特別這樣說 也因此在做do-loop時先column效能較好
12/19 23:24, 6F

12/20 02:18, , 7F
請問樓上:你所謂的「實際」是指標準就有明文規定嗎?
12/20 02:18, 7F

12/20 02:19, , 8F
不是約定成俗,你讓他跟c互傳資料就會發現有問題了。
12/20 02:19, 8F

12/20 02:51, , 9F
若既不在標準規範內,且亦非約定俗成(又名:歷史包袱)
12/20 02:51, 9F

12/20 02:52, , 10F
,則代表有些編譯器可能是column-major,有些則可能是
12/20 02:52, 10F

12/20 02:53, , 11F
row-major,意即某些編譯器的Fortran與C溝通時即便不
12/20 02:53, 11F

12/20 02:53, , 12F
轉置也不會有資料錯置的狀況(假設C規範是row-major)。
12/20 02:53, 12F

12/20 03:05, , 13F
我了解本文的意思,我一直以來也都是這麼被告知的,
12/20 03:05, 13F

12/20 03:05, , 14F
我好奇的是這說法究竟是人云亦云,還是明文規定?
12/20 03:05, 14F

12/24 18:00, , 15F
判斷是否column-major可以寫隻小程式計算運行的時間
12/24 18:00, 15F

12/24 18:00, , 16F
就可以很快地看出差異,不過現在的compiler都有最佳化
12/24 18:00, 16F

12/24 18:01, , 17F
直接用預設的選項去編譯程式是看不出來差異的
12/24 18:01, 17F

12/24 18:02, , 18F
可以額外加上把最佳化關掉的指令,就可以看出差異來
12/24 18:02, 18F
文章代碼(AID): #1KapR1Bk (Fortran)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1KapR1Bk (Fortran)