PTT
Submit
Submit
選擇語言
正體中文
简体中文
PTT
C_and_CPP
[問題] 陣列運算速度問題
作者:
w0005151
(藍廳)
2016-02-21 00:08:29
請教一下各位大大
最近有看到一個說法是C/C++在處理陣列時
用指標表示比用陣列表示的速度快
例如A,B是兩個大小M*N的二維double陣列
他們的型態是(double*)[N]
假設我要讓B陣列的元素值為A陣列對應位置的元素的兩倍
有以下作法
for(I=0;I<M;I++)
for(J=0;J<N;J++)
B[I][J]=2*A[I][J];
或
for(I=0;I<M;I++)
for(J=0;J<N;J++)
*(*(B+I)+J)=2*(*(*(A+I)+J));
或可令double *ptr1=&A[0][0],*ptr2=&B[0][0]
for(I=0;I<M*N;I++)
*(ptr1+I)=2*(*(ptr2+I));
請問這幾種寫法的運算速度會有明顯差別嗎?
作者:
Caesar08
(Caesar)
2016-02-21 10:17:00
這種問題你自己寫測試就知道
作者: LiloHuang (十年一刻)
2016-02-21 01:24:00
可用 -ftree-vectorizer-verbose=5 檢查是否有成功被套用了 Auto-vectorization另外 cache friendly 可看看這篇
http://goo.gl/W0bJ9j
作者:
ronin728
(浪人)
2016-02-21 01:11:00
手邊沒電腦手機不好打字,這講起來有點篇幅。所以自己查資料,或等其他高手講解。再補充一個,可以用SIMD加速不過聽說GCC開優化會自己加MMX,所以應該不用手動寫就是了
作者:
w0005151
(藍廳)
2016-02-21 00:57:00
感謝大大回答,再弱弱的問一下cache friendly是@@?
作者:
ronin728
(浪人)
2016-02-21 00:51:00
不會,因*(ptr + n)與ptr[n]在x86組合語言都是一樣的題外話,這除了改善演算法,也要注意cache friendly總之,*(ptr+n)的速度與p[n]完全相同
作者:
w0005151
(藍廳)
2016-02-21 00:46:00
因為我之後處理很大的陣列,所以還是想知道哪種寫法才是最好的@@
作者:
stupid0319
(徵女友)
2016-02-21 00:36:00
明顯差別一定是不可能的啦,除非拿很慢很慢的CPU來跑
繼續閱讀
[問題] 如何變更win32程式中 label的背景顏色
jyhchyunlu
[問題] uva548已ac但在線上編譯器卻無法執行?
ga544523
[問題] 又是一個指標問題= =...
kai5566
[問題] vc++ cannot open shared object file
yshihyu
[問題] 指標陣列 傳遞問題?想了超久
kai5566
[問題] 浮點數比較問題
popular10347
Re: [問題] printf & 型態轉換
drag
[問題]學習unique_ptr遇到的compile error
shaopin
[問題] SDL2 RenderPresent 的敘述看不太懂
ResolaQQ
[問題] 關於用win32 API 開啟檔案
jyhchyunlu
Links
booklink
Contact Us: admin [ a t ] ucptt.com