帧抓取器的多线程性能问题(使用Decklink SDK)

时间:2013-04-11 20:11:11

标签: c# multithreading task-parallel-library

我使用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%。我花了很多时间来了解发生了什么,但我还没找到路要走。

2 个答案:

答案 0 :(得分:0)

每个核心都有可能使用超线程,因此当您拥有4个物理内核时,您可能拥有8个逻辑内核。调整8个工作单元而不是4个单元,这样每个核心可以达到100%的利用率。

答案 1 :(得分:0)

首先:您是否期望个别任务受限于cpu?如果你在一个线程上运行,它是否总是使用100%的核心?如果没有,您可能受限于I / O。如果你运行两个核心而不是四个核心,结果是什么?

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

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