当前在线人数9938
首页 - 分类讨论区 - 电脑网络 - 葵花宝典版 - 同主题阅读文章

此篇文章共收到打赏
0

  • 10
  • 20
  • 50
  • 100
您目前伪币余额:0
未名交友
[更多]
[更多]
C++读取大型文件用于并行计算的问题
[版面:葵花宝典][首篇作者:yanb] , 2019年12月26日15:18:15 ,3864次阅读,91次回复
来APP回复,赚取更多伪币 关注本站公众号:
[首页] [上页][下页][末页] [分页:1 2 3 4 5 ]
yanb
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 1 ]

发信人: yanb (呀), 信区: Programming
标  题: C++读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Thu Dec 26 15:18:15 2019, 美东)

通常,主进程读取初始数据文件并切割分发到各进程,然后开始计算。对这种模式
测试了两千个节点规模的计算,发现:对中小规模数据可行,但是数据规模大到一
定程度,这个主进程切割并分发数据就慢得无法接受。例如,数据文件有50 million
个或更多记录(每个记录包含一个颗粒的大小,形状,空间位置,空间方向,运动状
态等等,全部读入消耗大约30GB内存),主进程将这50 million个颗粒进行三维毗邻
空间划分(也即计算各进程的初始空间和相应所含颗粒),并分发到相应的大约50k个
并行进程,主进程的这个双重循环过程(50k by 50M)基本无法完成。

想到以下几个方案:
1。上述的主进程读取初始数据文件,然后切割分发到各进程。
2。主进程读取初始数据文件,然后将整个数据文件broadcast到各进程,各进程自行
从接收到的数据文件寻找相应颗粒。与方案1相比,避免了双重循环。
3。各进程都读取初始数据文件,然后自行从接收到的数据文件寻找相应颗粒。也避免
了双重循环。
4。进行预处理将初始数据文件分割成大约50k个文件,各进程按文件编号进行读取。
5。将该数据文件完全parallel io化。注意输出文件并不会含有各进程占有多少纪录
或颗粒的信息,因此无法保证可以实现具有正确空间划分的并行输入。

方案2和3理论可行,实际上由于受到节点内存容量的限制,并非实际可行。现在一般
计算节点有128GB内存,大内存节点有512GB~1024GB内存。以一个节点36核(或进程)
为例,单节点需要内存30GBx36才能完成方案2或3。方案2也许可以改成异步broadcast,
让每个节点上的36个进程在不同时间接受数据、处理数据并释放内存,从而避免消耗巨
大内存。方案3也许可以改成让每个节点上的36个进程依次读取数据、处理数据并释放内
存,从而避免消耗巨大内存。这两个改进可能需要特别的进程控制和时序控制,并非易
事。

6。还有个方案是让每个节点的36个进程共享部分内存区域,其中一个进程读取数据,
其它进程自动获得这些数据。按方案2,主进程只需向各个节点的某一进程broadcast
数据;按方案3,各节点只需某一个进程读取数据文件。

请建议,谢谢。

补充说明:
先说明一下问题,用离散单元法(DEM)模拟颗粒行为,比如这种:https://www.
youtube.com/playlist?list=PL0Spd0Mtb6vVeXfGMKS6zZeikWT55l-ew

该方法原理非常简单,主要是颗粒形状的表达、颗粒之间的接触侦测和解析、颗粒之间
的接触模型的精度这些因素很消耗cpu。并行算法的基本思想就是用3d box/block划分
空间,各个颗粒按其质心所在位置划分到不同box。每个box及所含颗粒信息发送到对应
的cpu/core,各个box与相邻的boxes通过ghost layer(包含至少一层颗粒)交换接触
信息,每个box得与周边的26个邻居交换信息,视频中绿色网格就是用于空间划分的
boxes。动态过程中某个颗粒可能从一个box迁移到另一个box。

可以将上面视频得到的样本(1 million particles)进行复制,这样可以得到非常巨大
的样本,目标是100M或1 billion,作为初始计算数据。

原来用方案1处理1M左右的颗粒并没有遇到困难,但是处理50M用到更多cpu后就出现了
上述困难。








--
※ 修改:·yanb 於 Dec 27 14:31:23 2019 修改本文·[FROM: 67.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 67.]

 
magliner
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 2 ]

发信人: magliner (magliner), 信区: Programming
标  题: Re: C++读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Thu Dec 26 15:21:23 2019, 美东)

推荐卫东阅。
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 205.]

 
wdong
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 3 ]

发信人: wdong (万事休), 信区: Programming
标  题: Re: C++读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Thu Dec 26 18:30:24 2019, 美东)

几个建议:
1. 任务划分,我估计就是个hash函数。如果是我,我会在内存中建一个
50K个元素的hash表。然后把50M个颗粒往这个hash表里放。这个操作就是
一重循环。然后再把hash表里的50K个元素往外发,也就是发50K次,
肯定能完成了。

因为hash表里的元素长度不一,对应的计算量也是不确定的。所以随机
把50K个元素对应到n个节点,n越大负载就会越不均衡。所以可以在
头节点大致优化一下,想一个heuristic把50K个颗粒表划分到n个节点。
这样划分后,每次只要往一个节点发一个比较大的数据块就行,数据划分
的问题就解决了。

2. 因为数据本身也不是那么大,用2或者3应该也可以。就是稍微浪费点。

3. 你的每个计算机节点是多核,所以这种架构最好是MPI-OpenMP。
就是每个计算机内部用OpenMP写,共享内存。

4. 你这个问题我感觉不会是linearly scalable的。感觉会涉及到相邻颗粒
之间的interaction。这样的话估计也不是节点越多越好。我估计有个
十来台机器,算是320个节点,也就差不多了。节点再多估计也没用。

如果是我,我会试着先用一台机器算。



【 在 yanb (呀) 的大作中提到: 】
: 通常,主进程读取初始数据文件并切割分发到各进程,然后开始计算。对这种模式
: 测试了两千个节点规模的计算,发现:对中小规模数据可行,但是数据规模大到一
: 定程度,这个主进程切割并分发数据就慢得无法接受。例如,数据文件有50 million
: 个或更多记录(每个记录包含一个颗粒的大小,形状,空间位置,空间方向,运动状
: 态等等,全部读入消耗大约30GB内存),主进程将这50 million个颗粒进行三维毗邻
: 空间划分(也即计算各进程的初始空间和相应所含颗粒),并分发到相应的大约50k个
: 并行进程,主进程的这个双重循环过程(50k by 50M)基本无法完成。
: 想到以下几个方案:
: 1。上述的主进程读取初始数据文件,然后切割分发到各进程。
: 2。主进程读取初始数据文件,然后将整个数据文件broadcast到各进程,各进程自行
: ...................


--

※ 修改:·wdong 于 Dec 26 18:34:02 2019 修改本文·[FROM: 108.]
※ 来源:·BBS 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 108.]

 
xiaoju
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 4 ]

发信人: xiaoju (可爱的龙猫), 信区: Programming
标  题: Re: C++读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Thu Dec 26 19:03:38 2019, 美东)

这几种方案不应该有区别,楼主用错了什么东西吧

【 在 yanb (呀) 的大作中提到: 】
: 通常,主进程读取初始数据文件并切割分发到各进程,然后开始计算。对这种模式
: 测试了两千个节点规模的计算,发现:对中小规模数据可行,但是数据规模大到一
: 定程度,这个主进程切割并分发数据就慢得无法接受。例如,数据文件有50 million
: 个或更多记录(每个记录包含一个颗粒的大小,形状,空间位置,空间方向,运动状
: 态等等,全部读入消耗大约30GB内存),主进程将这50 million个颗粒进行三维毗邻
: 空间划分(也即计算各进程的初始空间和相应所含颗粒),并分发到相应的大约50k个
: 并行进程,主进程的这个双重循环过程(50k by 50M)基本无法完成。
: 想到以下几个方案:
: 1。上述的主进程读取初始数据文件,然后切割分发到各进程。
: 2。主进程读取初始数据文件,然后将整个数据文件broadcast到各进程,各进程自行
: ...................


--

※ 来源:·BBS 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 27.]

 
brainless
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 5 ]

发信人: brainless (n/a), 信区: Programming
标  题: Re: C++读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Thu Dec 26 21:40:13 2019, 美东)

visitor pattern + mmap
【 在 yanb (呀) 的大作中提到: 】
: 通常,主进程读取初始数据文件并切割分发到各进程,然后开始计算。对这种模式
: 测试了两千个节点规模的计算,发现:对中小规模数据可行,但是数据规模大到一
: 定程度,这个主进程切割并分发数据就慢得无法接受。例如,数据文件有50 million
: 个或更多记录(每个记录包含一个颗粒的大小,形状,空间位置,空间方向,运动状
: 态等等,全部读入消耗大约30GB内存),主进程将这50 million个颗粒进行三维毗邻
: 空间划分(也即计算各进程的初始空间和相应所含颗粒),并分发到相应的大约50k个
: 并行进程,主进程的这个双重循环过程(50k by 50M)基本无法完成。
: 想到以下几个方案:
: 1。上述的主进程读取初始数据文件,然后切割分发到各进程。
: 2。主进程读取初始数据文件,然后将整个数据文件broadcast到各进程,各进程自行
: ...................



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 115.]

 
echoisles
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 6 ]

发信人: echoisles (echoisles), 信区: Programming
标  题: Re: C++读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Thu Dec 26 22:46:48 2019, 美东)

用hadoop不好吗 一定要自己造轮子
【 在 yanb (呀) 的大作中提到: 】
: 通常,主进程读取初始数据文件并切割分发到各进程,然后开始计算。对这种模式
: 测试了两千个节点规模的计算,发现:对中小规模数据可行,但是数据规模大到一
: 定程度,这个主进程切割并分发数据就慢得无法接受。例如,数据文件有50 million
: 个或更多记录(每个记录包含一个颗粒的大小,形状,空间位置,空间方向,运动状
: 态等等,全部读入消耗大约30GB内存),主进程将这50 million个颗粒进行三维毗邻
: 空间划分(也即计算各进程的初始空间和相应所含颗粒),并分发到相应的大约50k个
: 并行进程,主进程的这个双重循环过程(50k by 50M)基本无法完成。
: 想到以下几个方案:
: 1。上述的主进程读取初始数据文件,然后切割分发到各进程。
: 2。主进程读取初始数据文件,然后将整个数据文件broadcast到各进程,各进程自行
: ...................



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 73.]

 
hfutxrg
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 7 ]

发信人: hfutxrg (hfutxrg), 信区: Programming
标  题: Re: C++读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Thu Dec 26 23:44:15 2019, 美东)

为什么不能并行读写?不同的进程读文件的任何位置都不会干扰。如果是要写到同一个
文件里面的话,那么每个进程写在自己所划分的一块区间就行了。
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 162.]

 
digua
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 8 ]

发信人: digua (姚之FAN), 信区: Programming
标  题: Re: C++读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Fri Dec 27 00:12:20 2019, 美东)

单节点的内存是够了。瓶颈很有可能在盘I/O和网络I/O。

【 在 yanb (呀) 的大作中提到: 】
: 通常,主进程读取初始数据文件并切割分发到各进程,然后开始计算。对这种模式
: 测试了两千个节点规模的计算,发现:对中小规模数据可行,但是数据规模大到一
: 定程度,这个主进程切割并分发数据就慢得无法接受。例如,数据文件有50 million
: 个或更多记录(每个记录包含一个颗粒的大小,形状,空间位置,空间方向,运动状
: 态等等,全部读入消耗大约30GB内存),主进程将这50 million个颗粒进行三维毗邻
: 空间划分(也即计算各进程的初始空间和相应所含颗粒),并分发到相应的大约50k个
: 并行进程,主进程的这个双重循环过程(50k by 50M)基本无法完成。
: 想到以下几个方案:
: 1。上述的主进程读取初始数据文件,然后切割分发到各进程。
: 2。主进程读取初始数据文件,然后将整个数据文件broadcast到各进程,各进程自行
: ...................

--

欢迎理性讨论,谢绝傻笑党跟随。

※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 73.]

 
akasha663
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 9 ]

发信人: akasha663 (akasha), 信区: Programming
标  题: Re: C++读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Fri Dec 27 00:32:00 2019, 美东)

是做分子动力学么,如果相互作用是近程(有cut-off distanve)的话还是可以scale得
很好的。如果是长距就得考虑一些special technique比如傅立叶变换了. 可以参考一
下LAMMPS的documentation
【 在 yanb (呀) 的大作中提到: 】
: 通常,主进程读取初始数据文件并切割分发到各进程,然后开始计算。对这种模式
: 测试了两千个节点规模的计算,发现:对中小规模数据可行,但是数据规模大到一
: 定程度,这个主进程切割并分发数据就慢得无法接受。例如,数据文件有50 million
: 个或更多记录(每个记录包含一个颗粒的大小,形状,空间位置,空间方向,运动状
: 态等等,全部读入消耗大约30GB内存),主进程将这50 million个颗粒进行三维毗邻
: 空间划分(也即计算各进程的初始空间和相应所含颗粒),并分发到相应的大约50k个
: 并行进程,主进程的这个双重循环过程(50k by 50M)基本无法完成。
: 想到以下几个方案:
: 1。上述的主进程读取初始数据文件,然后切割分发到各进程。
: 2。主进程读取初始数据文件,然后将整个数据文件broadcast到各进程,各进程自行
: ...................



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 67.]

 
chebyshev
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 10 ]

发信人: chebyshev (......), 信区: Programming
标  题: Re: C  读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Fri Dec 27 00:58:02 2019, 美东)

他要的“相应颗粒“这步如果是严格的话。启发式似乎无法解决。缺点类似
于5。

他还是要把划分的逻辑说一下。不然无法解决的。


【 在 wdong(万事休) 的大作中提到: 】
<br>: 几个建议:
<br>: 1. 任务划分,我估计就是个hash函数。如果是我,我会在内存中建一个
<br>: 50K个元素的hash表。然后把50M个颗粒往这个hash表里放。这个操作就是
<br>: 一重循环。然后再把hash表里的50K个元素往外发,也就是发50K次,
<br>: 肯定能完成了。
<br>: 因为hash表里的元素长度不一,对应的计算量也是不确定的。所以随机
<br>: 把50K个元素对应到n个节点,n越大负载就会越不均衡。所以可以在
<br>: 头节点大致优化一下,想一个heuristic把50K个颗粒表划分到n个节点。
<br>: 这样划分后,每次只要往一个节点发一个比较大的数据块就行,数据划分
<br>: 的问题就解决了。
: ...................
<br>

--
※ 修改:·chebyshev 於 Dec 27 01:00:06 2019 修改本文·[FROM: 2607:fb90:22d7:e]
※ 来源:· 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:22d7:]

 
chebyshev
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 11 ]

发信人: chebyshev (......), 信区: Programming
标  题: Re: C  读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Fri Dec 27 01:04:05 2019, 美东)

楼主标题没写清楚。我的理解是,一个节点读了一条记录后,
只能接受这个初始节点按照某个算法(空间毗邻)挑出来的那些记录。

不是任意读写的问题。


【 在 hfutxrg(hfutxrg) 的大作中提到: 】
<br>: 为什么不能并行读写?不同的进程读文件的任何位置都不会干扰。如果是要写到
同一个
<br>: 文件里面的话,那么每个进程写在自己所划分的一块区间就行了。
<br>
--
※ 来源:· 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:22d7:]

 
pingapplevlj
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 12 ]

发信人: pingapplevlj (sanjack), 信区: Programming
标  题: Re: C++读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Fri Dec 27 01:25:30 2019, 美东)

用的是什么io library;(可用parallel hdf5)
用的是什么文件系统;
这些都挺关键。
文件是一个?直接并行读即可.
--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2600:1010:b041:]

 
chebyshev
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 13 ]

发信人: chebyshev (......), 信区: Programming
标  题: C  读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Fri Dec 27 01:26:29 2019, 美东)

采用2或者3。例如可以用方案2一次一批数据的来解决。

例如分十块,每块同步一次广播。

不需要考虑特别复杂的时序。等待其他节点处理完即可。






--
※ 修改:·chebyshev 於 Dec 27 01:33:48 2019 修改本文·[FROM: 2607:fb90:22d7:e]
※ 来源:· 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:22d7:]

 
chebyshev
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 14 ]

发信人: chebyshev (......), 信区: Programming
标  题: Re: C  读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Fri Dec 27 01:34:16 2019, 美东)

他不是卡在读写。他要分类


【 在 pingapplevlj(sanjack) 的大作中提到: 】
<br>: 用的是什么io library;(可用parallel hdf5)
<br>: 用的是什么文件系统;
<br>: 这些都挺关键。
<br>: 文件是一个?直接并行读即可.
<br>
--
※ 来源:· 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2607:fb90:22d7:]

 
wdong
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 15 ]

发信人: wdong (万事休), 信区: Programming
标  题: Re: C++读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Fri Dec 27 09:52:01 2019, 美东)

有可能。应该用MPI_Scatterv的地方用了for (;;) {MPI_Send}?
卡在延时了。



【 在 xiaoju (可爱的龙猫) 的大作中提到: 】
: 这几种方案不应该有区别,楼主用错了什么东西吧



--

※ 修改:·wdong 于 Dec 27 09:55:10 2019 修改本文·[FROM: 108.]
※ 来源:·BBS 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 108.]

 
pptwo
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 16 ]

发信人: pptwo (pp), 信区: Programming
标  题: Re: C++读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Fri Dec 27 11:56:04 2019, 美东)

楼主以前的文章看起来写C++也有几年了,不至于不知道这个吧 ...

不过前面文章里没有提到数据量广播模式网速这些重要参数,也没法判断到底有多慢。

【 在 wdong (万事休) 的大作中提到: 】
: 有可能。应该用MPI_Scatterv的地方用了for (;;) {MPI_Send}?
: 卡在延时了。



--

※ 来源:·BBS 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 98.]

 
yanb
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 17 ]

发信人: yanb (呀), 信区: Programming
标  题: Re: C++读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Fri Dec 27 13:07:40 2019, 美东)

先谢谢大家,我一个一个来回答。先说明一下问题,用离散单元法(DEM)模拟颗粒行
为,比如这种https://www.youtube.com/playlist?list=
PL0Spd0Mtb6vVeXfGMKS6zZeikWT55l-ew

该方法原理非常简单,主要是颗粒形状的表达、颗粒之间的接触侦测和解析、颗粒之间
的接触模型的精度这些因素很消耗cpu。并行算法的基本思想就是用3d box/block划分
空间,各个颗粒按其质心所在位置划分到不同box。每个box及所含颗粒信息发送到对应
的cpu/core,各个box与相邻的boxes通过ghost layer(包含至少一层颗粒)交换接触
信息,每个box得与周边的26个邻居交换信息,视频中绿色网格就是用于空间划分的
boxes。

可以将上面视频得到的样本(1 million particles)进行复制,这样可以得到非常巨大
的样本,目标是100M或1 billion,作为初始计算数据。

原来用方案1处理1M左右的颗粒并没有遇到困难,但是50M用到更多cpu后就出现了上述
困难。




--
※ 修改:·yanb 於 Dec 27 14:04:13 2019 修改本文·[FROM: 67.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2601:281:8500:3]

 
yanb
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 18 ]

发信人: yanb (呀), 信区: Programming
标  题: Re: C++读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Fri Dec 27 13:34:19 2019, 美东)

非常感谢。
1. hash表可能是个非常好的建议,我先想想。
2. MPI-OpenMP这个hybrid模式做过仔细研究,对我这个特定问题其计算效率远不如
pure MPI,hybrid模式的效率收敛于pure MPI模式。
3. 没错,并非节点越多越好,大致每个core算几百个颗粒是最优计算尺度。并行通讯的
overhead也算比较高的,能达到10-15%,毕竟要交换很多颗粒。
4. 我在16核工作站上测试了方案2,boost.mpi 1.65.1版本显示调用isend出现错误,
但boost.mpi 1.70.0工作正常,不会很快就耗尽了192GB内存。

【 在 wdong (万事休) 的大作中提到: 】
: 几个建议:
: 1. 任务划分,我估计就是个hash函数。如果是我,我会在内存中建一个
: 50K个元素的hash表。然后把50M个颗粒往这个hash表里放。这个操作就是
: 一重循环。然后再把hash表里的50K个元素往外发,也就是发50K次,
: 肯定能完成了。
: 因为hash表里的元素长度不一,对应的计算量也是不确定的。所以随机
: 把50K个元素对应到n个节点,n越大负载就会越不均衡。所以可以在
: 头节点大致优化一下,想一个heuristic把50K个颗粒表划分到n个节点。
: 这样划分后,每次只要往一个节点发一个比较大的数据块就行,数据划分
: 的问题就解决了。
: ...................



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2601:281:8500:3]

 
yanb
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 19 ]

发信人: yanb (呀), 信区: Programming
标  题: Re: C++读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Fri Dec 27 13:40:58 2019, 美东)

能否简单描述一下?谢谢。模式我很陌生,只用过singleton。
【 在 brainless (n/a) 的大作中提到: 】
: visitor pattern + mmap



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2601:281:8500:3]

 
yanb
进入未名形象秀
我的博客
[回复] [回信给作者] [本篇全文] [本讨论区] [修改] [删除] [转寄] [转贴] [收藏] [举报] [ 20 ]

发信人: yanb (呀), 信区: Programming
标  题: Re: C++读取大型文件用于并行计算的问题
发信站: BBS 未名空间站 (Fri Dec 27 13:41:54 2019, 美东)

不懂hadoop啊

【 在 echoisles (echoisles) 的大作中提到: 】
: 用hadoop不好吗 一定要自己造轮子



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 2601:281:8500:3]

[首页] [上页][下页][末页] [分页:1 2 3 4 5 ]
[快速返回] [ 进入葵花宝典讨论区] [返回顶部]
回复文章
标题:
内 容:

未名交友
将您的链接放在这儿

友情链接


 

Site Map - Contact Us - Terms and Conditions - Privacy Policy

版权所有,未名空间(mitbbs.com),since 1996