一个混乱的gpu/cpu联合调度 大文本离线计算任务,求大佬指导设计方案,没有完整方案只提建议也接受

之前的描述

问答:golang协程调度 - 线程数设置越多,资源利用率越低,执行时间无差别...

执行流程如图所示

一个混乱的gpu/cpu联合调度 大文本离线计算任务,求大佬指导设计方案,愿意付费,没有完整方案只提建议也接受

执行过程说明:

  1. 解析bed文件,按业务逻辑拆分为多个region。(一次性执行完全部放入channel,与后续计算无竞争关系)
  2. 使用Region pool并行管理N个region处理线程,针对每一个region:
    2.1. 初始化一个reader读取record(借助htslib)
    2.2. 使用map对record进行配对(配对结果流出速度不稳定,可能相差不远就能配对,也可能距离几万个record才配对)
    2.3. 配对后根据业务逻辑区分delins和nonDelins(1:9)
    2.4. 汇集一组delins后(64)或一组nonDelins(4096)后分别提交给go worker和gpu worker完成这一组计算
    2.5. 每一个region内初始化一个result,属于同一组的所有go worker和gpu worker将结果写入同一个result
    2.6. 待record读取计算结束,将result写入result channel
  3. writer线程处理result channel中的数据,输出到文件。

一些测试和结果和个人分析

1.执行读record,配对record然后丢弃,不做下游计算。
一个混乱的gpu/cpu联合调度 大文本离线计算任务,求大佬指导设计方案,愿意付费,没有完整方案只提建议也接受

  1. 线程池使用的ants。根据其提供的接口动态监控正在执行的worker数量。
    监控方法:
    一个混乱的gpu/cpu联合调度 大文本离线计算任务,求大佬指导设计方案,愿意付费,没有完整方案只提建议也接受
    poolSize分配:
    生产者线程: 即流程图中的regionPoolSize = 32
    go计算线程: batchNum=64,PoolSize = 64
    cuda计算线程:batchNum=4096,PoolSize = 64
    执行现场:
    生产者数量全程 = 32 为线程池最大值
    go计算线程 30-50少数时候会达到64
    cuda计算线程 30-50少数时候会达到64
DPeng
讨论数量: 10

有demo吗?

主要是不知道具体是计算啥不好预测优化方案

2年前 评论
DPeng (楼主) 2年前
DPeng

运行环境比较复杂。1.读数据依赖一个开源库,叫htslib,需要编译好配置动态链接库路径。2. 依赖cuda,需要有gpu和cuda运行环境。3. 程序有三个输入文件。这个我可以切到MB级别发出来。或者,如果您有兴趣帮我看看,我可以给代码,并配合你的猜想做一些测试,截屏或共享屏幕给你。

2年前 评论
renxiaotu 2年前
DPeng

得嘞,感谢感谢,不过,代码是团队集体开发的,应该不能直接公开出来,我重新画了一个流程图来解释执行过程,你先看看行嘛,或者您给我一个github或者gitee的账号,我建一个私库共享给你。

2年前 评论
renxiaotu 2年前

有串行你的 cpu 就不会存在满载;

你在提交合并的时候应该采用异步提交,避免多协程的调度切换,至少会减少一部分。

2年前 评论
DPeng (楼主) 2年前

好奇2.4和2.5是怎么具体实现的

2年前 评论
DPeng (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!