0

我使用 Blackmagic 硬件和 decklink SDK 开发了一个 C# 图像采集卡。我的主程序在 MTAthread 模式下运行。

在每个新帧上,我都有一个回调函数,名为VideoInputFrameArrived(). 我正在从此函数调用一些多线程任务,如下所示:

t1 = Task.Factory.StartNew(() => tempmatch.PictureAnalysis(x1));
t2 = Task.Factory.StartNew(() => tempmatch.PictureAnalysis(x2));
t3 = Task.Factory.StartNew(() => tempmatch.PictureAnalysis(x3));
t4 = Task.Factory.StartNew(() => tempmatch.PictureAnalysis(x4));

Task.WaitAll(t1, t2, t3, t4);

它工作正常,但我不能超过 50% 的 CPU 使用率;我的 CPU 的 4 个内核中的每一个都以 50% 的速度运行。我花了很多时间来了解发生了什么,但我还没有找到要走的路。

4

2 回答 2

0

每个核心都有可能使用超线程,所以当你有 4 个物理核心时,你可能有 8 个逻辑核心。启动 8 个工作单元而不是 4 个,以便每个内核可以达到 100% 的利用率。

于 2013-04-11T20:23:05.653 回答
0

首先:您是否希望单个任务受到cpu限制?如果您在单线程上运行,它会始终 100% 使用内核吗?如果没有,您可能会受到例如 I/O 的限制。如果你在两个核心而不是四个核心上运行,结果会怎样?

如果您希望单个任务受到 cpu 限制,请查看是否存在任何锁争用。这些任务是完全独立的,还是它们会争用锁,例如将结果存储在某个共享数据结构中,例如某个地方的 ConcurrentDictionary?Visual Studio(某些版本)中有一些工具可以让您可视化锁定争用。转到分析 > 启动性能向导。

并行 .NET 代码中的一个常见问题是 GC 受限,在 VS 的并发分析工具中,这将显示为一个线程定期暂停以等待 GC,因为分配是在另一个线程上完成的。如果您遇到这种情况,您基本上是在分析中以过高的速率分配内存。尝试在分析之前而不是在分析内部分配结果结构,并在并行执行期间尽量少分配。您还可以尝试使用不同的 GC 模式(服务器/工作站)和 GC 延迟模式来减少 GC 暂停。

于 2013-04-11T20:23:22.277 回答