作者doasgloria (青柳立夏)
看板C_and_CPP
標題[問題] 同時對array的多個位置取值的方法
時間Mon Apr 13 21:12:18 2020
各位版友大大們好
小魯C++很差 很久沒碰
只是需要很有效率實現某個功能
Python的速度感覺還不敷使用
想洽詢看看C++是否有更快的方法 !
想做的是這樣
有兩個3維的array A跟B, 大概像 int [x][y][z]
x,y,z都很大可能到幾千~
A一開始是空的 B的每個位置都有整數數值
要把A的每個位置, 根據已經有的索引
用B的某個位置的數字填進來
比如 A[0][0][0] = B[100][200][300]
每個位置之間的對應是屬於隨機分布~
直到 A[x][y][z], 把A整個填滿~
想問問 如果要用比三層for迴圈有效率的方式
怎樣做可以最快呢 @@?
感謝大大的幫助 >///<
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.25.45.239 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1586783543.A.8DB.html
※ 編輯: doasgloria (114.25.45.239 臺灣), 04/13/2020 21:13:36
1F:推 LiloHuang: numba 試了還是不行? 04/13 22:38
2F:→ LiloHuang: 如果能跑多個 thread, 就用用 tbb::parallel_for 看看 04/13 22:41
3F:→ LiloHuang: 但可能得特別避開一下 false sharing 造成的性能損失 04/13 22:43
4F:→ hsnuyi: 首先 把A做出來後下一步是啥? 有一定要建立A嗎? 直接讀取B 04/13 23:52
5F:→ hsnuyi: 不行嗎? 04/13 23:52
6F:→ hsnuyi: 再者 你的隨機是怎樣的隨機? 04/13 23:54
7F:→ hsnuyi: 最後 B有可能超過10億個元素 你有試過了嗎? 04/13 23:57
8F:→ SocketAM2: 我的直覺是memcpy再random swap 04/14 00:15
9F:→ SocketAM2: 如果你的隨機不需AB一一對應那應該可以更簡單一點 04/14 00:21
10F:→ loveme00835: 你知道這樣一個陣列有多大嗎?xD 04/14 10:39
11F:推 qscgy4: 我覺得你要先擔心你的記憶體夠不夠? 04/14 11:30
12F:推 pziyout: 假設每一維度有 3000 個,三維共有 27x10^9 個整數,兩個 04/14 15:26
13F:→ pziyout: 陣列的整數共需 208x10^9 位元組,你的記憶體夠大嗎? 04/14 15:32
14F:→ doasgloria: 不好意思沒寫清楚 實際上大概是 3500*3500*3 例子有誤 04/14 16:24
15F:→ doasgloria: 有用NUMBA做 PYTHON試過最快的是NUMBA 但還希望加快 04/14 16:25
16F:推 LiloHuang: 聽聞先前提的 numba 效率很快備感欣慰, 再試試 tbb 吧 04/14 16:57
18F:→ LiloHuang: Intel VTune 有免費 license 也可以拿來 profiling 04/14 17:01
19F:推 plsmaop: 如果是連續的話就 memcpy 啊 04/15 19:33
20F:→ plsmaop: 啊沒看到是隨機分佈,抱歉 04/15 19:33
21F:推 lc85301: 怎麼聽起來有點 sparse matrix 的感覺? 04/16 13:27
22F:→ MOONRAKER: 就講了要塞滿怎麼可能sparse 04/18 16:04