- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 WPF 应用程序来处理来自红外摄像机的图像数据流。该应用程序使用一个类库来处理重新缩放或着色等步骤,这也是我自己编写的。图像处理步骤看起来像这样:
ProcessFrame(double[,] frame)
{
int width = frame.GetLength(1);
int height = frame.GetLength(0);
byte[,] result = new byte[height, width];
Parallel.For(0, height, row =>
{
for(var col = 0; col < width; ++col)
ManipulatePixel(frame[row, col]);
});
}
帧由在后台运行的任务处理。问题是,根据特定处理算法 ( ManipulatePixel()
) 的成本,应用程序无法再跟上相机的帧速率。但是,我注意到尽管我使用了并行 for 循环,但应用程序根本不会使用所有可用的 CPU - 任务管理器性能选项卡显示大约 60-80% 的 CPU 使用率。
我之前在 C++ 中使用过相同的处理算法,使用并行模式库中的 concurrency::parallel_for
循环。正如我所料,C++ 代码使用了它可以获得的所有 CPU,而且我还尝试了 PInvoking
我的 C# 代码中的 C++ DLL,执行在 C# 库中运行缓慢的相同算法 - 它还使用了所有可用的 CPU 能力,CPU 使用率几乎始终保持在 100%,并且跟上相机的速度完全没有问题。
将代码外包到 C++ DLL 中,然后将其编码回 C# 是一个额外的麻烦,我当然宁愿避免。如何让我的 C# 代码真正利用所有 CPU 潜力?我试过像这样增加进程优先级:
using (Process process = Process.GetCurrentProcess())
process.PriorityClass = ProcessPriorityClass.RealTime;
有影响,但影响很小。我还尝试为 Parallel.For()
循环设置并行度,如下所示:
ParallelOptions parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = Environment.ProcessorCount;
然后将其传递给 Parallel.For()
循环,这根本没有效果,但我想这并不奇怪,因为默认设置应该已经优化过了。我还尝试在应用程序配置中进行设置:
<runtime>
<Thread_UseAllCpuGroups enabled="true"></Thread_UseAllCpuGroups>
<GCCpuGroup enabled="true"></GCCpuGroup>
<gcServer enabled="true"></gcServer>
</runtime>
但这实际上使它运行得更慢。
编辑:我最初引用的 ProcessFrame 代码块实际上并不完全正确。我当时在做的是:
ProcessFrame(double[,] frame)
{
byte[,] result = new byte[frame.GetLength(0), frame.GetLength(1)];
Parallel.For(0, frame.GetLength(0), row =>
{
for(var col = 0; col < frame.GetLength(1); ++col)
ManipulatePixel(frame[row, col]);
});
}
对此感到抱歉,当时我正在解释代码,但我没有意识到这是一个实际的陷阱,会产生不同的结果。从那以后,我将代码更改为我最初编写的代码(即在函数开头设置的宽度和高度变量,并且数组的长度属性每个只查询一次,而不是在 for 循环的条件语句中查询)。谢谢@Seabizkit,你的第二条评论启发了我尝试这个。事实上,这种变化已经使代码运行速度明显加快——我没有意识到这一点,因为 C++ 不知道二维数组,所以无论如何我不得不将像素尺寸作为单独的参数传递。但是我还不能说它是否足够快。
也感谢您提供的其他答案,它们包含很多我还不知道的东西,但很高兴知道我必须寻找什么。一旦我达到满意的结果,我会更新。
最佳答案
我需要拥有您的所有代码并能够在本地运行它才能诊断问题,因为您的帖子没有详细信息(我需要查看您的 ManipulatePixel
函数内部,以及调用 ProcessFrame
的代码)。但这里有一些适用于您的情况的一般提示。
.NET 中的二维数组比一维数组和交错数组慢得多,即使在今天的 .NET Core 中也是如此 - 这是一个长期存在的错误。
stackalloc
来管理缓冲区的生命周期并将该指针(不安全
哎呀!)传递给您的线程委托(delegate)。在线程之间共享内存缓冲区使系统更难优化安全内存访问。
考虑使用 .NET 中的 SIMD 和 AVX 功能。虽然现代 C/C++ 编译器足够智能,可以编译代码以使用这些指令,但 .NET JIT 并不是那么热门 - 但您可以显式调用 SMID/AVX instructions using the SIMD-enabled types (您需要使用 .NET Core 2.0 或更高版本以获得最佳加速功能)
此外,避免在 C# 中的 for
循环内复制单个字节或标量值,而是考虑使用 Buffer.BlockCopy
进行批量复制操作(因为这些可以使用硬件内存复制功能)。
关于您对“80% CPU 使用率”的观察 - 如果您在程序中有一个循环,那么将在操作系统提供的时间片内导致 100% CPU 使用率-系统 - 如果您没有看到 100% 使用率,那么您的代码:
Thread.Sleep
。当您认为应该受 CPU 限制时,使用 ETW 等工具查看您的进程正在做什么。lock
(Monitor
)调用或使用其他线程或内存同步原语。关于c# - Parallel.For 循环的完整 CPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58026420/
具体详细介绍请看下文: 在使用文件进行交互数据的应用来说,使用FTP服务器是一个很好的选择。本文使用Apache Jakarta Commons Net(commons-net-3.3.jar)
我在日志文件中收到这些警告: WARN 2013-01-15 00:08:15,550 org.eclipse.jetty.http.HttpParser- HttpParser Full for
我在使用特定网页时遇到问题。当我按下链接时,我收到应用程序错误(不是 http 错误等,而是应用程序级别错误)。 但是我打开了开发人员工具和网络控制台,我看到没有请求发送到服务器。 所以我双击并选择查
我没有组装经验,但这是我一直在做的。如果在通过程序集中的指针传递参数和调用函数时缺少任何基本方面,我希望输入。 例如,我想知道是否应该还原ecx,edx,esi,edi,。我读到它们是通用寄存器,但我
我没有组装经验,但这是我一直在做的。如果在通过程序集中的指针传递参数和调用函数时缺少任何基本方面,我希望输入。 例如,我想知道是否应该还原ecx,edx,esi,edi,。我读到它们是通用寄存器,但我
我正在尝试创建完整 uiscrollview 的快照,所有内容大小,我已经搜索了很多,并且我在 SO 上找到了一些东西,如下所示: Getting a screenshot of a UIScroll
我想复制一个包含以下结构的Vector,对我来说重要的是在修改复制的 vector 时保持原始Vector完整: public class objet_poid_n { public int
给定一个示例字符串 s = '嗨,我的名字是 Humpty-Dumpty,来自“爱丽丝,爱丽丝镜中奇遇记”',我想将其分成以下 block : # To Do: something like {l =
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我正在尝试创建一个正则表达式来查找文本中的 Linux 文件路径,但是正则表达式对我来说非常陌生。我有下面的代码片段,它将识别下面文件结构的开头。 .*(/bin/|/home/).* 完成正则表达式
我正在寻找远程托管的 JPG 的尺寸、宽度和高度。我已经了解了如何通过下载完整图像来执行此操作。 但是,如果我可以通过仅下载足以获取此信息的方式来做到这一点,那将是理想的。 典型的图像大小为 200K
有没有办法让下面的代码: import traceback def log(message): print "%s: %s" %(traceback.extract_stack()[0:-1]
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
git show 显示了修订版中所做的所有更改。但是,它会打印出所有更改——而不仅仅是文件名。 git show --stat 只显示文件名,但它把它们截断了!有没有办法获得已更改文件名的完整列表?
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想要改善这个问题吗?更新问题,以便将其作为on-topi
当我在模板中调用我的模型 get_absolute_url 方法时,我想要一个绝对/完整的 url。在我的入门模型中,我有以下内容: def get_absolute_url(self): r
我正在使用 jQuery 1.5.1 这是我的代码: $('.cellcontent').animate({ left: '-=190'}, { easing: alert('start
我正在使用下面的方法删除条形图并使用新数据更新条形图,但这样做时出现了一个小故障/完整的图表消失 1 秒,直到加载新数据。但是是否可以通过仅增加/减少柱形而不实际消失图表来实现相同的目的。 d3.se
基于 this question 中的讨论,任何人都可以提供代码或代码链接,显示 NumericLiteralX 模块的完整实现(例如 this one )?我对 NumericLiteralX 模块
我的目标是检索网站的 html,并将其转换为可读的String。我下面的代码可以工作,但我遇到了一个技术问题:当我尝试检索 http://time.gov/HTML5 的 html 时,我在 andr
我是一名优秀的程序员,十分优秀!