2013-04-11 1 views
0

Blackmagic 하드웨어와 decklink SDK를 사용하여 C# 프레임 그래버를 개발했습니다. 내 메인 프로그램은 MTA 스레드 모드에서 실행됩니다.프레임 그래버를 사용한 멀티 스레딩 성능 문제 (Decklink SDK 사용)

각 새 프레임에는 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 %로 실행됩니다. 나는 무슨 일이 일어나고 있는지 이해하기 위해 많은 시간을 보냈지 만 갈 방법을 찾지 못했습니다.

+0

더 이상의 정보가 없으면 우리가 당신을 도울 수 없다고 생각합니다. – svick

답변

0

우선 : 개별 작업이 CPU로 제한 될 것으로 예상합니까? 단일 스레드에서 실행하는 경우 항상 코어를 100 % 활용합니까? 그렇지 않은 경우 예를 들어 제한 될 수 있습니다. 입출력. 4 개가 아닌 2 개의 코어로 실행하면 결과는 어떻습니까?

개별 작업이 cpu로 제한 될 것으로 예상되는 경우 계속 진행중인 잠금 경합이 있는지 확인하십시오. 이러한 작업은 완전히 분리되어 있습니까? 예를 들어 ConcurrentDictionary와 같은 공유 데이터 구조에 결과를 저장하여 잠금을 옹호 할 수 있습니까? Visual Studio의 도구 (일부 버전)에서는 잠금 경합을 시각화 할 수 있습니다. 분석> 성능 마법사 시작으로 이동하십시오.

병렬 코드의 일반적인 문제는 .NET 코드가 제한되어 있기 때문에 VS의 동시성 프로파일 링 도구에서 다른 스레드에서 할당이 이루어지기 때문에 주기적으로 GC를 기다리는 중 하나의 스레드로 표시됩니다. 이 문제가 발생하면 기본적으로 분석에서 너무 높은 속도로 메모리를 할당합니다. 분석 내부가 아닌 결과 구조를 할당하고 병렬 실행 중에 가능한 한 적은 할당을 시도하십시오. GC 일시 중지를 줄이기 위해 다른 GC 모드 (서버/워크 스테이션) 및 GC 대기 모드를 시험해 볼 수도 있습니다.

+0

이미지 분석 (메서드 이름으로 표시)은 매우 CPU 집약적 인 것으로 알려져 있으므로 적어도 그렇게 할 가능성이 큽니다. 대부분의 이러한 문제 (GC 수집, 입출력 제한 등)는 매우 높거나 낮은 이용률 사이에서 코어가 진동하는 것을 볼 수 있지만 오랜 시간 동안 약 50 % 정도는 앉아 있지 않은 것으로 보입니다. 그가 말하길 : "나는 50 % 이상의 CPU 사용률을 낼 수 없다"는 것은 짧은 기간이라도 더 높지 않을 것이라는 것을 의미합니다. 따라서이 답변은 OP의 경우에 적용될 가능성이 적습니다. – Servy

+0

@Anders Forsgren 당신은 맞습니다. for 루프에서 너무 높은 비율로 변수를 할당하고있었습니다. 이제 CPU로드가 95 %에 도달했습니다. 감사 ! – Worthatry

0

가능성은 각각 하이퍼 스레딩을 사용하므로 4 개의 물리적 코어가있는 경우 8 개의 논리적 코어가있는 것입니다. 각 코어가 100 % 사용률로 이동할 수 있도록 4 대신 8 단위 업을 스핀 업하십시오.

+0

나는 이미 이것을 시도했지만 CPU는 여전히 50 %이고 치료는 약 두 번 걸린다. 내 CPU는 i5 2500k입니다. – Worthatry

+0

@Worthatry 움직이지 않고 정확히 50 %에 앉아 있긴하지만, 50 %로 최대치를 내고 있지만 그보다 훨씬 많은 시간을 보내고 있습니까? 아마도 작업 관리자의 스크린 샷을 제공 할 수 있습니까? – Servy