gpt4 book ai didi

C# 多线程没有使用足够的 cpu

转载 作者:行者123 更新时间:2023-11-30 20:30:34 24 4
gpt4 key购买 nike

我正在尝试加速我用 C# 编写的算法。我想到的第一件事就是让它平行。

该算法必须运行大量(~数百万)个二维段,每个段都独立于其他段。

代码如下:`

    private void DoMapping(Segment[] image, CancellationToken ct, int numTasks = 3)   
{
long time = Environment.TickCount;
LaserOutput = new List<Vector3[]>();
NormalsOutput = new List<Vector3>();
Task< Tuple < List<Vector3[]>, List < Vector3 >>>[] tasks = new Task<Tuple<List<Vector3[]>, List<Vector3>>>[numTasks];

int perTaskSegments = image.Length / numTasks;

for (int taskIndex = 0; taskIndex < tasks.Length; taskIndex++)
{

int nseg = perTaskSegments * (taskIndex + 1) + (taskIndex == tasks.Length - 1 ? image.Length % tasks.Length : 0);
int from = perTaskSegments * taskIndex;
Tuple<int, int, Segment[], CancellationToken> obj = new Tuple<int, int, Segment[], CancellationToken>(from, nseg, image, ct);
tasks[taskIndex] = Task.Factory.StartNew(DoComputationsAction, obj, CancellationToken.None, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}

Task.WaitAll(tasks);

for (int taskIndex = 0; taskIndex < tasks.Length; taskIndex++)
{
LaserOutput.AddRange(tasks[taskIndex].Result.Item1);
NormalsOutput.AddRange(tasks[taskIndex].Result.Item2);
}
}

private Tuple<List<Vector3[]>, List<Vector3>> DoComputationsAction(object obj)
{
Tuple<int, int, Segment[], CancellationToken> parm = obj as Tuple<int, int, Segment[], CancellationToken>;
List<Vector3[]> tmpLaser = new List<Vector3[]>();
List<Vector3> tmpNormals = new List<Vector3>();

bool errorOccured = false;
for (int segCounter = parm.Item1; segCounter < parm.Item2 && !errorOccured; segCounter++)
{
if (parm.Item4.IsCancellationRequested)
break;
try
{
var res = SplitOverMap(parm.Item3[segCounter], (string error) => {
errorOccured = true;
MessageBox.Show(error, "An error occured", MessageBoxButtons.OK, MessageBoxIcon.Error);
Logger.Log("An error occured while mapping data to 3d.");
});

if (res != null)
{
tmpLaser.AddRange(res.Item1);
tmpNormals.AddRange(res.Item2);
}
}
catch (Exception e)
{
Logger.Log("An error occured while calculating 3d map. Skipping polyline." + e.Message);
}
}

return new Tuple<List<Vector3[]>, List<Vector3>>(tmpLaser, tmpNormals);
}`

在 SplitOverMap 中,执行对空间数据结构 (QTree) 的查询,然后进行一些计算。

没有锁在整个过程中被执行。 未使用磁盘

对于可能导致 CPU 使用率仅达到 40-60 的原因,您有什么建议吗?

我也曾尝试将 num task 更改为 4、6 和 8。没有重大变化。

我正在考虑 GC,但我无法做很多事情来阻止它运行。

编辑: 通过减少一些类的内存使用,我设法稍微提高了 CPU 使用率,现在它运行在 70% 左右。

另一方面,通过提高四叉树的级别阈值,我获得了显着的性能提升。

最佳答案

因为您的段之间没有需要额外同步的依赖关系,所以我建议查看任务并行库 (TPL)。 Parallel.ForParallel.ForEach 您可能会感兴趣。

要优化您现有的代码,有几种选择:

  • 删除 TaskCreationOptions.LongRunning。它可能会产生新的线程,这很耗时。
  • 创建您自己的任务调度程序并为底层线程提供更高的优先级。它也可以在试验 TPL 并行循环时使用。目前,您正在使用默认线程池,其他组件可能会使用/阻止该线程池。

更新:另见 lowering priority of Task.Factory.StartNew thread关于如何创建具有不同优先级的自定义任务计划程序。它工作得很好,我将它用于几个项目。另请参阅 Stephen Toub 的博客。

关于C# 多线程没有使用足够的 cpu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44581483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com