了解 VS2010 C# 并行分析结果

2023-12-23

我有一个包含许多独立计算的程序,因此我决定对其进行并行化。

我使用 Parallel.For/Each。

对于双核机器来说,结果还不错——大多数时候 CPU 利用率约为 80%-90%。 然而,对于双 Xeon 机器(即 8 核),我只能获得大约 30%-40% 的 CPU 利用率,尽管该程序在并行部分花费了相当多的时间(有时超过 10 秒),而且我发现它使用了与串行部分相比,这些部分中的线程大约多 20-30 个。每个线程需要超过 1 秒才能完成,因此我认为它们没有理由不并行工作 - 除非存在同步问题。

我使用VS2010的内置分析器,结果很奇怪。 即使我只在一处使用锁,探查器报告大约 85% 的程序时间花费在同步上(还有 5-7% 的睡眠时间,5-7% 的执行时间,低于 1% 的 IO)。

锁定的代码只是缓存(字典)get/add:

bool esn_found;
lock (lock_load_esn)
    esn_found = cache.TryGetValue(st, out esn);
if(!esn_found)
{
    esn = pData.esa_inv_idx.esa[term_idx];
    esn.populate(pData.esa_inv_idx.datafile);
    lock (lock_load_esn)
    {
        if (!cache.ContainsKey(st))
            cache.Add(st, esn);
    }
}

lock_load_esn是 Object 类型的类的静态成员。
esn.populate每个线程使用单独的 StreamReader 从文件中读取数据。

但是,当我按“同步”按钮查看导致最大延迟的原因时,我发现探查器报告的是函数入口行,并且不报告锁定部分本身。
它甚至没有报告包含上述代码的函数(提醒 - 唯一的lock在程序中)作为噪声水平 2% 的阻塞配置文件的一部分。当噪音水平为 0% 时,它会报告程序的所有功能,我不明白为什么它们被视为阻塞同步。

所以我的问题是 - 这是怎么回事?
怎么可能85%的时间都花在了同步上呢?
我如何找出程序并行部分的真正问题是什么?

Thanks.

Update:深入研究线程(使用非常有用的可视化工具)后,我发现大部分同步时间都花在等待 GC 线程完成内存分配上,并且由于通用数据结构调整大小操作,需要频繁的分配。

我必须了解如何初始化我的数据结构,以便它们在初始化时分配足够的内存,从而可能避免 GC 线程的竞争。

我将在今天晚些时候报告结果。

Update:看来内存分配确实是问题的原因。当我对并行执行的类中的所有字典和列表使用初始容量时,同步问题较小。我现在只有大约 80% 的同步时间,CPU 利用率峰值为 70%(之前的峰值仅为 40% 左右)。

我进一步深入研究每个线程,发现现在对 GC allocate 的许多调用都是为了分配不属于大字典的小对象。

我通过为每个线程提供一个预先分配的此类对象池解决了这个问题,我使用它而不是调用“新”函数。

所以我本质上为每个线程实现了一个单独的内存池,但是以一种非常粗暴的方式,这是非常耗时的,而且实际上不是很好 - 我仍然需要使用很多new对于这些对象的初始化,现在我只在全局执行一次,并且 GC 线程上的争用更少,即使在必须增加池的大小时也是如此。

但这绝对不是我喜欢的解决方案,因为它不容易推广,而且我不想编写自己的内存管理器。
有没有办法告诉 .NET 为每个线程分配预定义的内存量,然后从本地池中获取所有内存分配?


能不能少分配一点?

我有过几次类似的经历,查看糟糕的性能并发现问题的核心是 GC。然而,在每种情况下,我都发现我在某些内部循环中意外地耗尽了内存,不必要地分配了大量的临时对象。我会仔细查看代码,看看是否有可以删除的分配。我认为程序很少“需要”在内循环中进行大量分配。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 VS2010 C# 并行分析结果 的相关文章

  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • Java中如何将一个int转换为三个字节?

    我正在尝试转换int分成三份bytes代表那个int 大端 我确信它与按位和移位有关 但我不知道该怎么做 例如 int myInt some code byte b1 b2 b3 b1 is most significant then b2
  • 证明某种语言正则

    在我的计算理论课上 我们的作业是证明一种语言是正规的 该语言定义为 B 1ky y is in 0 1 and y contains at least k 1s for k gt 1 在我看来 这种语言需要一个下推自动机来为此创建一台机器
  • 用于检查更新、安装新版本应用程序的代码

    我有一个 NET 4 WPF 应用程序 它使用 MSI 进行安装 该 MSI 通过 Visual Studio 安装项目生成 一切都很好 除了我缺少 单击一次部署 功能 该功能在加载时检查应用程序的新版本并下载 安装它们 我放弃了 单击一次
  • 引起原因:java.lang.ClassNotFoundException:org.jets3t.service.ServiceException

    我的代码应该访问存储在 S3 上的一些文件 此代码在一台机器上运行良好 而在另一台机器上失败 基本上 当它从 Intellij IDEA 本地 而不是在集群上 执行时 它会失败 sc hadoopConfiguration set fs s
  • Android Emitter.Listener 不工作

    我正在制作一个带有套接字 IO 的应用程序 它正确连接到服务器 但它不侦听事件 这是我的代码的一部分 private Socket mSocket try mSocket IO socket ip 8000 catch URISyntaxE
  • 如何在 php 中添加 blob 图像 FIrebird?

    无法将照片添加到 FIrebird 写这样的代码 imgSrc Desert jpg img src imgSrc imgbinary fread fopen img src r filesize img src img str base6
  • 无法在Azure函数中使用JpegBitmapEncoder

    在测试 Azure Functions 时 我编写了以下 blob 触发的代码 r System Drawing r PresentationCore r WindowsBase using System Drawing Imaging u
  • awk:仅在某些字段中查找和替换[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个像这样的文本文件 cat test 12 13 2100 s 12 13 3100 s 100 13 100 s 12 13 30
  • 在图片框上添加标签

    我想在我的图片框上写一些文字 所以我认为最简单和最好的办法就是在它上面画标签 这就是我所做的 PB new PictureBox PB Image Properties Resources Image PB BackColor Color
  • OpenAI GPT-2 模型与 TensorFlow JS 结合使用

    是否可以使用 TensorFlowJS 从 OpenAI GPT 2 生成文本 如果不是 限制是什么 例如模型格式或 我看不出有任何理由不这样做 除了 gpt 2 中的某些操作可能不受 tensorflowjs 支持 我不知道该怎么做 但这
  • Django登录用户从未实现

    我的 Django 登录遇到问题 下面的 if 语句 如果 user 不是 None 总是解析为 false 因此它转移到 else 上 我不知道为什么 我将不胜感激任何帮助 Thanks VIEWS PY from django shor
  • python中float的底层数据结构

    有一个关于 Python 中浮点 和精度 的底层数据结构的问题 gt gt gt b 1 4 2 3 gt gt gt b 3 6999999999999997 gt gt gt c 3 7 gt gt gt c 3 70000000000
  • 如何使用 Visual Studio Code 单步执行依赖项代码?

    在调试我的用户代码时 我想进入已安装的依赖项的代码 例如和pip install e path to package 我试图在项目中找到一个列出依赖项的位置 并且可以浏览它以打开源文件进行调试 例如 这可以在 PyCharm 中通过 外部库
  • python中没有负值的插值

    我一直在尝试根据这些值创建一条平滑的线 但结果中不能有负值 到目前为止 我尝试过的所有方法都给出了负值 希望得到一些帮助 import matplotlib pyplot as plt from scipy interpolate impo
  • 使用 NodeJS 从 csv 文件映射数组以实现树层次结构可视化

    我试图以可视化方式展示 SQL 表之间的关系 我的 csv 表中有三列 列 Target Source JoinSource Column Target每个单元格中都有一个表名称 例如 A1 A2 A3 An Column Source具有
  • Excel VBA - 按照表中的描述添加行

    我正在尝试复制这个观点 https i stack imgur com PSKKh png其中底部表中的新行是根据顶部表的 A 列中的值创建的 这是我的代码 Sub testProc Worksheets Sheet1 Activate D
  • “Blueimp jQuery 文件上传”重命名文件

    我正在使用 Blueimp jQuery 文件上传工具 我想在上传文件时完全重命名它们 由于照片被添加到基于 userID 的唯一目录中 因此我真的只想添加名称为 001 jpg 002 jpg 003 jpg 等的照片 我怎样才能完成此操
  • Angular,如何有条件地设置必填字段的样式?

    在按下提交按钮之前 我不想显示表单的验证 按下按钮时 如果有效 则应提交表单 如果未提交 则无效字段应以红色突出显示 由于遗留原因 我导入了一个 css 文件 它定义了input invalid具有红色背景 因此任何输入字段都标记为requ
  • 将 ../ 与 docker-compose 卷一起使用时会发生什么

    我在将文件从 docker 容器内写入主机时遇到问题 我相信这是一个特权问题并且不想设置privileged True 写出文件的解决方法是预先挂起 到我的一卷docker compose yml文件 例如 version 3 servic
  • 了解 VS2010 C# 并行分析结果

    我有一个包含许多独立计算的程序 因此我决定对其进行并行化 我使用 Parallel For Each 对于双核机器来说 结果还不错 大多数时候 CPU 利用率约为 80 90 然而 对于双 Xeon 机器 即 8 核 我只能获得大约 30