作者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/cn.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