我有一个类似于下面代码的函数。其目的是从一组点中一次取出一个三角形面,其中每三个点都是一个面,并对它们进行细分,用一系列边长不超过 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
具有适当的尺寸。
- Divide
Points
into several parts ('several' can be hard to estimate, you should play with this a little bit). Say your list has 12,000,000 points, so resultList
is 4,000,000 element long. And say you decide 4 parts is the optimal split.
- 每个部分必须是连续的(0-3M、3M-6M、6M-9M、9M-12M)。
- 找到最佳分割并不容易,但简单的分割可能就足够了,所以现在不用担心。
- 有 4 个线程,每个线程处理一个部分(您可以使用Task API http://msdn.microsoft.com/en-us/library/dd537609.aspx,在我看来,这会让代码比
Parallel.For
在这种情况下。
关于线程安全的注意事项:
我不是 100% 相信List<Point>
当您将其用作固定大小的数组时,它是线程安全的。应该是,但如果你想 100% 确定,请使用数组。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)