gpt4 book ai didi

.net - 在 .net 4.5 中并行化 for 循环

转载 作者:行者123 更新时间:2023-12-02 00:15:07 25 4
gpt4 key购买 nike

我有一个类似于下面代码的函数。其目的是从一组点中一次提取一个三角形面,其中每三个点是一个面,并对它们进行镶嵌,用边长不超过 nodeSize 的较小面列表替换该面。

当然,对于任何现实的小平面网格来说,这个函数都是耗时的。我想重构它以使用一些粗略的并行化。但是,Parallel.For 似乎没有办法在保留索引号的同时按一定时间间隔遍历数组中的索引。

请记住,循环内的 SplitTriangle 函数在计算上不利于并行化,我该如何重构此函数?

Protected Shared Function SplitTriangles(Points As IEnumerable(Of Point3D), nodeSize As Single) As List(Of Point3D)
Dim resultList As New List(Of Point3D)

For i As Integer = 0 To Points.Count - 1 Step 3
resultList.AddRange(SplitTriangle(Points(i), Points(i + 1), Points(i + 2), nodeSize * 4))
Next

Return resultList
End Function

最佳答案

我认为这里最简单的解决方案是首先遍历这些点并将它们分成一组 3 点组。然后你可以使用Parallel.For在那个阵列上。

编辑:既然你有数百万点并且一直这样做,你应该做点别的。

首先,确保您的 Points容器允许轻松随机访问(使用数组或 List )。然后这样做:

  • 分配 resultList大小合适。
  • 划分Points分成几个部分(“几个”可能很难估计,你应该稍微玩一下)。假设您的列表有 12,000,000 个点,所以 resultList是 4,000,000 个元素长。并假设您决定 4 个部分是最佳分割。
    • 每个部分都必须是连续的(0-3M、3M-6M、6M-9M、9M-12M)。
    • 找到最佳拆分并不容易,但琐碎的拆分可能就足够了,所以暂时不要担心。
  • 有 4 个线程,每个线程处理一个部分(您可以使用 Task API,在我看来,这会使代码比本例中的 Parallel.For 更清晰。

关于线程安全的注意事项:

我不是 100% 相信 List<Point>当您将它用作固定大小的数组时是线程安全的。应该是,但如果您想 100% 确定使用数组。

关于.net - 在 .net 4.5 中并行化 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13593342/

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