我为采矿业构建了一个连续模拟模型(基于状态)。出于工程和生产目的跟踪设备,当事件发生时更新设备状态,例如故障、生产事件等。使用了许多统计分布。出于说明目的,请参阅下面的代码以了解模拟的工作原理。我正在尝试优化性能。基本上需要运行数以千计的“案例”。根据我可用的物理线程数量,我可以并行运行 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 以大大加快速度。
- 1 回答
- 0 关注
- 161 浏览
添加回答
举报
0/150
提交
取消