[問題] memcpy 與 for 迴圈選擇

看板C_and_CPP (C/C++)作者 (小豆豆)時間15年前 (2011/02/18 23:55), 編輯推噓4(4013)
留言17則, 8人參與, 最新討論串1/2 (看更多)
請問一下各位大大 如果現在有兩個大小為20萬以上的一維陣列 那如果要把 A 陣列的東西都丟給 B 陣列 大家會選擇用memcpy 還是就用一個 for 迴圈 去做? 或是有其他更好的方法可以用呢? 再請問一下如果 要做 A 陣列 + B 陣列用SSE要怎麼做呢? SSE要怎麼一次載入四個值 是要先有二個大小為 4 的陣列 然後把 A 跟 B 的前四個值先丟進去再用SSE的指令load進來還是怎樣 如果是上述的方法 那這樣用SSE的加速效果會因為要把四個值丟進去大小為四的 陣列裡而有影響呢? -- 拿阿! 拿回去還是一輩子當x教授的魁儡 一輩子做實習 寫程式 要的話你就拿回去! 九世宅男:下輩子不要再讓我讀工科~~~~~~~~!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.216.83

02/19 00:07, , 1F
memcpy 因為可以把效能責任推給compiler廠商!
02/19 00:07, 1F

02/19 00:08, , 2F
just for fun, OK 可以使用 for loop
02/19 00:08, 2F

02/19 00:09, , 3F
為了more fun 那就 練習使用 stream/string movement
02/19 00:09, 3F

02/19 00:10, , 4F
stream/string move, X86/ARM都不一樣 可以玩玩 ^^
02/19 00:10, 4F

02/19 00:26, , 5F
用rep movsd
02/19 00:26, 5F

02/19 00:28, , 6F
st大說的是組語嗎 要怎麼在c++裡使用呢?
02/19 00:28, 6F

02/19 00:29, , 7F
mov edi,B ; mov esi,A ; mov ecx,200000 ; rep movsd
02/19 00:29, 7F

02/19 00:33, , 8F
for loop就算了........
02/19 00:33, 8F

02/19 01:14, , 9F
memcpy/ CopyMemory的底層應該就是直接被翻成rep movsd
02/19 01:14, 9F

02/19 01:27, , 10F
雖然沒有測但老實說我認為 for loop 也會被翻成最有效率
02/19 01:27, 10F

02/19 01:40, , 11F
SSE: www.csie.ntu.edu.tw/~r89004/hive/sse/page_4.html
02/19 01:40, 11F

02/19 01:48, , 12F
以 Keil C51 來說, for loop 會比較有效率
02/19 01:48, 12F

02/19 01:49, , 13F
memcpy 敗在它是通用的,實在是非戰之罪 :p
02/19 01:49, 13F

02/19 01:50, , 14F
如果效率對你真那麼重要,應該花些時間都測試一下
02/19 01:50, 14F

02/19 22:47, , 15F
rep movsd 會比 mov eax, [esi] mov [edi], ecx 慢喔
02/19 22:47, 15F

02/19 22:48, , 16F
打錯了 是 mov [edi], eax
02/19 22:48, 16F

02/19 22:49, , 17F
原因是 rep movsd 是屬於 legacy 用法 沒被硬體最佳化過
02/19 22:49, 17F
文章代碼(AID): #1DNfQCsc (C_and_CPP)
文章代碼(AID): #1DNfQCsc (C_and_CPP)