[問題] 同時對array的多個位置取值的方法

看板C_and_CPP作者 (青柳立夏)時間5年前發表 (2020/04/13 13:12), 5年前編輯推噓6(6016)
留言22則, 10人參與, 5年前最新討論串1/2 (看更多)
各位版友大大們好 小魯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://www.ptt.cc/bbs/C_and_CPP/M.1586783543.A.8DB.html ※ 編輯: doasgloria (114.25.45.239 臺灣), 04/13/2020 21:13:36

04/13 22:38, 5年前 , 1F
numba 試了還是不行?
04/13 22:38, 1F

04/13 22:41, 5年前 , 2F
如果能跑多個 thread, 就用用 tbb::parallel_for 看看
04/13 22:41, 2F

04/13 22:43, 5年前 , 3F
但可能得特別避開一下 false sharing 造成的性能損失
04/13 22:43, 3F

04/13 23:52, 5年前 , 4F
首先 把A做出來後下一步是啥? 有一定要建立A嗎? 直接讀取B
04/13 23:52, 4F

04/13 23:52, 5年前 , 5F
不行嗎?
04/13 23:52, 5F

04/13 23:54, 5年前 , 6F
再者 你的隨機是怎樣的隨機?
04/13 23:54, 6F

04/13 23:57, 5年前 , 7F
最後 B有可能超過10億個元素 你有試過了嗎?
04/13 23:57, 7F

04/14 00:15, 5年前 , 8F
我的直覺是memcpy再random swap
04/14 00:15, 8F

04/14 00:21, 5年前 , 9F
如果你的隨機不需AB一一對應那應該可以更簡單一點
04/14 00:21, 9F

04/14 10:39, 5年前 , 10F
你知道這樣一個陣列有多大嗎?xD
04/14 10:39, 10F

04/14 11:30, 5年前 , 11F
我覺得你要先擔心你的記憶體夠不夠?
04/14 11:30, 11F

04/14 15:26, 5年前 , 12F
假設每一維度有 3000 個,三維共有 27x10^9 個整數,兩個
04/14 15:26, 12F

04/14 15:32, 5年前 , 13F
陣列的整數共需 208x10^9 位元組,你的記憶體夠大嗎?
04/14 15:32, 13F

04/14 16:24, 5年前 , 14F
不好意思沒寫清楚 實際上大概是 3500*3500*3 例子有誤
04/14 16:24, 14F

04/14 16:25, 5年前 , 15F
有用NUMBA做 PYTHON試過最快的是NUMBA 但還希望加快
04/14 16:25, 15F

04/14 16:57, 5年前 , 16F
聽聞先前提的 numba 效率很快備感欣慰, 再試試 tbb 吧
04/14 16:57, 16F

04/14 17:00, 5年前 , 17F

04/14 17:01, 5年前 , 18F
Intel VTune 有免費 license 也可以拿來 profiling
04/14 17:01, 18F

04/15 19:33, 5年前 , 19F
如果是連續的話就 memcpy 啊
04/15 19:33, 19F

04/15 19:33, 5年前 , 20F
啊沒看到是隨機分佈,抱歉
04/15 19:33, 20F

04/16 13:27, 5年前 , 21F
怎麼聽起來有點 sparse matrix 的感覺?
04/16 13:27, 21F

04/18 16:04, 5年前 , 22F
就講了要塞滿怎麼可能sparse
04/18 16:04, 22F
文章代碼(AID): #1Ub6KtZR (C_and_CPP)
文章代碼(AID): #1Ub6KtZR (C_and_CPP)