为了账号安全,请及时绑定邮箱和手机立即绑定

连续模拟 - 性能调优 - GPU/CPU

连续模拟 - 性能调优 - GPU/CPU

C#
ibeautiful 2021-10-23 17:03:45
我为采矿业构建了一个连续模拟模型(基于状态)。出于工程和生产目的跟踪设备,当事件发生时更新设备状态,例如故障、生产事件等。使用了许多统计分布。出于说明目的,请参阅下面的代码以了解模拟的工作原理。我正在尝试优化性能。基本上需要运行数以千计的“案例”。根据我可用的物理线程数量,我可以并行运行 x 个案例。因此 CPU 工作在 100%。运行 1000 个案例可能需要一天以上的时间。从应用的结构上,有没有机会引入GPU计算?我从来没有用 GPU 编程过,想知道我是否有机会以某种方式将 GPU 包含在我的计算中。任何其他建议也将不胜感激。public static void RunAll(){   //This list contains thousands cases   List<SimCase> simCases = ImportCases()   //List which contains simulation results   ConcurrentBag<Results> resultsList = new ConcurrentBag<Results>();   //Runs cases in parallel (consumes all threads)   Parallel.ForEach(simCases, simCase =>   {      var results = RunSimulation(simCase);      resultsList.Add(results);   });  //Interpret results and build report}public static Results RunSimulation(SimCase simCase){   Results results = new Results();   DateTime currentDate = new DateTime(2018,1,1);   DateTime finalDate= new DateTime(2018,12,31);   while (currentDate < finalDate)   {      //Many if statements      //Many object updates      //Many functions calls to libraries for statistical calcs      //Updates simulation time      currentDate = currentDate.addSeconds(1);   }   return(results);}
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

在我的情况下,GPU 似乎没有多大帮助,因为我的程序严重依赖第三方数学库,if 语句和对象迭代/更新。以下是让我提高 50% 性能的原因:

  • 在列表上将所有 .Count() 更改为 .Count

  • 在数组上将所有 .Count() 更改为 .Length

  • 在 IEnumerable 集合上将 .Count() == 0 表达式更改为 .Any()

我将投资一个 32 线程 CPU 以大大加快速度。


查看完整回答
反对 回复 2021-10-23
  • 1 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信