[問題] 大矩陣的存取

看板C_and_CPP (C/C++)作者 (samio)時間15年前 (2011/03/25 01:13), 編輯推噓3(3023)
留言26則, 3人參與, 最新討論串1/1
開發平台(Platform): GCC, Linux 問題(Question): 我是新手... 有看過13戒和google但是還沒有找到答案 所以希望版上先進能夠給我些方向 我的問題是這樣: 因為需要大矩陣的計算,所以用malloc來要求記憶體 矩陣從硬碟讀入,A.mat 還有 B.mat 計算的結果也寫入硬碟,addTest.mat 下面附上的code在矩陣夠小的時候都還ok 但是維度過千之後就有問題了 在ubuntu底下的錯誤訊息是 Segmentation fault 用gdb的錯誤訊息是 "Program received signal SIGSEGV, Segmentation fault." 錯誤都發生在矩陣讀入的時候 readMatrix gdb下逐行執行,在錯誤之前 print *matrix都回傳正確的值 (矩陣的第一個元素) 後來回傳的值就變成"Cannot access memory at address" 我的問題是... 到底是哪裡出錯阿 而這個錯誤又可以怎麼解決呢? 1000 by 1000 矩陣還只是測試階段就有這種問題...orz 懇請版上的高手們救救我@@ 餵入的資料(Input): 兩個矩陣的檔案 A.mat 和 B.mat 程式碼(Code):(請善用置底文網頁, 記得排版) http://paste.plurk.com/show/405625/ 補充說明(Supplement): 請不要鞭我的語法@@ 其實我從來沒有用過malloc 還在學習中 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.234.211 ※ 編輯: fuqule 來自: 114.32.234.211 (03/25 01:15)

03/25 01:29, , 1F
裡面的 double a[SIZE*SIZE]; 拿掉試試?
03/25 01:29, 1F

03/25 01:29, , 2F
猜可能是它把 stack 吃光了? 而且也根本沒用到
03/25 01:29, 2F

03/25 01:41, , 3F
謝謝!都沒有發現還有這樣的廢物XD
03/25 01:41, 3F

03/25 01:43, , 4F
不過這樣最主要的問題還沒解決 有辦法脫去stack的限制嗎?
03/25 01:43, 4F

03/25 01:49, , 5F
你都用malloc了,不是已經解決記憶體限制
03/25 01:49, 5F
我猜問題是出在 readMatrix 的寫法有問題 因為 1000 by 1000 的矩陣資料 才不到 7MB 之前有測試過用同樣的函數宣告大矩陣,資料大小到2~3GB都沒問題 ※ 編輯: fuqule 來自: 114.32.234.211 (03/25 01:53)

03/25 01:58, , 6F
抱歉抱歉 C還不熟 忘記stack的限制就是用malloc XD
03/25 01:58, 6F

03/25 01:58, , 7F
我這邊測試 2048 *2048 matrix 拿掉 double a[SIZE*SIZE];
03/25 01:58, 7F

03/25 01:59, , 8F
就沒事了
03/25 01:59, 8F

03/25 01:59, , 9F
有的話會 seg fault 編譯參數 gcc -g3 / x86_64 / Linux
03/25 01:59, 9F

03/25 02:02, , 10F
可以請教一下編譯參數後面那些是怎麼加嗎?
03/25 02:02, 10F

03/25 02:03, , 11F
是不是這樣:gcc foo.c變成gcc -g3 / x86_64 / Linux foo.c
03/25 02:03, 11F

03/25 02:03, , 12F
編譯參數只有 -g3 啦,後面是描述我的環境XD
03/25 02:03, 12F

03/25 02:04, , 13F
不加編譯參數我還是會有 seg fault
03/25 02:04, 13F

03/25 02:05, , 14F
喔喔喔 謝謝啦 我搞錯了XD
03/25 02:05, 14F

03/25 02:06, , 15F
所以是拿掉那行就能動了吧??
03/25 02:06, 15F

03/25 02:08, , 16F
謝謝你的幫忙 但是我還是有 seg faultㄝ
03/25 02:08, 16F

03/25 02:08, , 17F
我的環境跟你的一樣
03/25 02:08, 17F

03/25 02:11, , 18F
抱歉抱歉,我在電腦上不是單一檔案,三個函數都是分開的
03/25 02:11, 18F

03/25 02:12, , 19F
我把code貼成一個檔案就沒有seg fault了
03/25 02:12, 19F

03/25 02:13, , 20F
但是這好像更奇怪...@@ 為什麼分開compile會有seg fault呢?
03/25 02:13, 20F

03/25 02:16, , 21F
有點不好意思繼續問,但是我最後希望能夠編個別的程式碼
03/25 02:16, 21F

03/25 02:16, , 22F
我還是希望能弄懂到底問題在哪裡...orz
03/25 02:16, 22F

03/25 02:17, , 23F
傳 A.mat 上來看看吧
03/25 02:17, 23F
因為還在測試,所以 A.mat 和 B.mat 是每個元素都是rand的矩陣 是用下面的程式碼造的 http://paste.plurk.com/show/405717 ※ 編輯: fuqule 來自: 114.32.234.211 (03/25 02:23)

03/25 02:33, , 24F
1000X1000, 一個檔案、分三檔案,都測了,都正確
03/25 02:33, 24F

03/25 02:40, , 25F
@@ 我還在掙扎耶... 看來應該是我自己的問題了
03/25 02:40, 25F

03/25 02:41, , 26F
非常感謝a大和p大的幫忙和測試! 感激不盡!
03/25 02:41, 26F
終於找到問題來補PO一下 其實問題說到底是因為我是菜鳥XD 想要分開編譯但是又沒有正確的header file格式 最後老老實實的把每個檔案(還有header file) 的include libaries寫好就沒有問題了 再次感謝 a大 和 p大 的大力幫忙! ※ 編輯: fuqule 來自: 114.32.234.211 (03/25 02:58)
文章代碼(AID): #1DYtkwZJ (C_and_CPP)
文章代碼(AID): #1DYtkwZJ (C_and_CPP)