在 .net 4.5 中通过单步并行化 for 循环

2024-01-15

我有一个类似于下面代码的函数。其目的是从一组点中一次取出一个三角形面,其中每三个点都是一个面,并对它们进行细分,用一系列边长不超过 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(使用前将#替换为@)

在 .net 4.5 中通过单步并行化 for 循环 的相关文章

随机推荐

  • 使用 AngularJS 和 Highlight.js 进行动态语法突出显示

    我正在构建一个网站来说明常见的应用程序漏洞 例如 SQL 注入 我在用AngularJS and 高亮 js创建交互式示例 如何让 AngularJS 和highlight js 都更新我的代码片段 Example 这把小提琴 http j
  • 重复使用表格单元格中的 UIswitch

    我的 uiswitch 有问题UITableViewCell每当我更改属于特定部分的特定单元格中的开关值时 所有其他具有相同部分的单元格inexPath row改变 请帮忙 这是我的代码cellForRowAtIndexPath metho
  • 把一个偶数分成N份,每份都是2的倍数

    假设我有号码100我需要将其分为 N 部分 每个部分最初不应超过 30 因此初始分组为 30 30 30 余数 即 10 将通过连续向每个组添加 2 来分配到这三个组中 从而确保每个组都是 2 的倍数 因此 所需的输出应类似于 34 34
  • html DOM 节点限制

    我正在开发一个终端模拟器以获取乐趣 并了解后端的基础知识和运行 然而 我不断遇到前端的性能问题 大家可能都知道 终端窗口中的每个字符都可以有不同的样式 颜色 背景 粗体 下划线等 所以我的想法是使用 span 对于视图窗口中的每个字符 并在
  • 如何获取 Angular Material 滑块的当前值?

    我的问题与获取角度 2 中的 mdslider 值 https stackoverflow com questions 46906219 get mdslider value in angular 2因为我需要将滑块的值传递给组件 而不是
  • Java 中的 MidiUnavailableException?

    我在 Java 中播放 MIDI 文件时遇到一些问题 我得到的是一个MidiUnavailableException MIDI OUT transmitter not available 当我尝试玩它时 我的代码是标准的 try midis
  • 在 Python 中解压格式字符

    我需要这个 Perl 字符串的 Python 模拟 unpack nNccH string val 我需要nNccH Python 格式字符的数据格式 在 Perl 中 它将二进制数据解压为五个变量 网络 中的 16 位值 大端 网络 中的
  • 如何在 Vue.js 中延迟 @keyup 处理程序

    my view ns input filterName type text v model filterName keyup searchTimeOut 在我的 vue 代码中 getUsers API users index params
  • QStyledItemDelegate 绘制刷新问题

    我目前正在尝试研究模型视图方法并编写缩略图查看器应用程序 在此示例中 我只是尝试绘制 20 个框 但我得到的似乎是随机选择 该选择会随着鼠标移动而更新 滚动使事情变得更糟 有时绘制的只有框等 而且文本似乎根本没有渲染 对我来说 这看起来像是
  • 为什么我们需要strdup()?

    当我在做作业时 我开始知道我们不应该使用诸如以下的作业 char s HELLO WORLD 使用此类语法的程序很容易崩溃 我尝试并使用 int fun char temp do sum operation on temp print te
  • 在 CAS 中,如果尚未接受协议,如何限制仅访问一项服务?

    有一个要求 用户应该首先接受一些许可协议 存在仅在服务中 以便能够登录所有其他服务 所以流程应该是 用户通过CAS登录 因为他还没有接受协议 所以只能登录serviceS 当他接受serviceA上的协议后 他也可以登录其他服务 Notes
  • 选择后提交

    我读过解释时commit可能需要在selectDB2 和 MySQL 的语句 DB2 中的选择查询是否需要提交 https stackoverflow com questions 1521475 is a commit needed on
  • appengine 上的查询响应大小限制?

    Appengine 文档提到实体大小和批量获取请求 db get 的 1Mb 限制 http code google com appengine docs python datastore overview html http code g
  • Nginx/Web 服务器术语中的“反向代理”和“负载平衡”是什么?

    这是我经常听到的两个短语 主要与 Nginx 相关 有人可以给我一个外行的定义吗 定义通常很难理解 我想您只需要对其用例进行一些解释 简单解释一下就是 负载均衡是反向代理的功能之一 反向代理是可以做负载均衡的软件之一 下面给出了一个很长的解
  • 从大型数组中返回均匀“间隔”数量的索引。

    我有一个包含 20 个 RGB 颜色值的 Javascript 数组 如下所示 defaultColors rgb 58 185 180 rgb 63 186 172 rgb 71 185 159 rgb 80 185 146 rgb 90
  • PHP.net 说 md5() 和 sha1() 不适合密码?

    http www php net manual en faq passwords php faq passwords fasthash http www php net manual en faq passwords php faq pas
  • 根据 QWizardPage 内容的变化动态添加/删除 Finish

    我正在关注 a 上的教程许可证向导 http doc qt io qt 5 qtwidgets dialogs licensewizard example html using PyQt5 尝试学习如何创建非线性向导 然而我似乎陷入了一个问
  • 加载共享库时出错:libbsoncxx.so._noabi:无法打开共享对象文件:没有这样的文件或目录

    我安装了 mongocxx 驱动程序 如图所示http mongodb github io mongo cxx driver mongocxx v3 installation http mongodb github io mongo cxx
  • Android 自动调整 TextViews 在减小字体大小之前会分割单词

    有办法避免吗 如果我的文本是 Blablabla 并且它不适合正方形 我不希望有类似的内容 Blabla bla 我想要较小字体的 Blablabla 有没有办法控制自动调整大小的 TextView 是否会分割单词 这是该问题的一个示例 最
  • 在 .net 4.5 中通过单步并行化 for 循环

    我有一个类似于下面代码的函数 其目的是从一组点中一次取出一个三角形面 其中每三个点都是一个面 并对它们进行细分 用一系列边长不超过 nodeSize 的较小面替换该面 当然 对于任何现实的小面网格来说 此函数都是耗时的 我想重构它以使用一些