2010-06-21 4 views
5

막연한 주제의 질문에 대해 유감스럽게 생각합니다.하지만 일부 학술 동영상 처리 루틴을 연구 중입니다. 알고리즘은 MATLAB로 작성되었으며, 개발 목적으로는 괜찮지 만 약 60spf 또는 약 0.0166fps로 비디오를 처리했습니다. 말할 필요도없이, 이것은 데모 등으로는 충분하지 않습니다. 그래서 여름 방학은 일과를 급격하게 더 빨리 할 수있는 것으로 바꾸는 것입니다.당황스러운 병렬 문제에 가장 적합한 솔루션은 무엇입니까?

nvidia의 GPGPU 솔루션 인 CUDA의 코드 중 가장 느린 부분을 다시 작성했습니다. 그러나 상대적으로 연속적이기 때문에 CPU에서 더 잘 수행되는 것으로 보이는 코드의 상당 부분이 있습니다. 문제는 내가받은 머신에 총 8 개의 논리 코어가있는 2 개의 제온 프로세서가 있으며 단일 코어 만 코딩하여 병목 현상을 일으키는 것은 수치 스럽습니다. 비디오 변환 프로세스는 각 프레임이 다른 프레임에 의존하지 않는다는 점에서 기능적입니다. 그래서 어떤 종류의 비동기식 큐/스트림이 최선이라고 생각했습니다.

내 질문은 거짓말 : 수율을 높이기위한 최선의 노력으로 이러한 유형의 병렬 처리를 구현하는 가장 좋은 방법은 무엇입니까?

내가 본 솔루션 중 일부는 OpenMP, .net TPL 및 간단한 pthreads입니다.

비동기 프로그래밍에 대한 기본 노출 만 있기 때문에 뮤텍스 및 장벽을 무너 뜨리는 대신 라이브러리 또는 무언가를 사용하여 여러 번 발을 쏠 수 있습니다. 이번 여름의 목표 중 하나이기 때문에 배우는 것도 괜찮습니다. 그러나 동시에 병렬 처리는 입니다. 그러나, 속도 차이가 실제로 매우 두드러지면, 나는 2 주 동안 내 머리카락을 꺼내려고합니다. : P

미리 감사드립니다.

+0

잘 정의 된 동기화 포인트를 사용하여 간섭없이 작업 할 수있는 여러 부분으로 문제를 해결할 수 있다면 사용 된 "라이브러리"는 단지 설탕이어야합니다 ... 한 가지 간단한 방법은 쓰레드 풀, 동시 큐 (하나는 입력 용, 다른 하나는 출력용), 그리고 그 쓰레드가 소유하고있는 객체/데이터에만 접근 할 수 있습니다 (이것은 변경할 수없는 외부 구조로 확대 될 수 있습니다). –

답변

3

양보하려는 노력을 극대화하려는 것이 목표라면, .NET의 TPL을 살펴 보는 것이 좋습니다. 이것은 아마도 이것을 구현하는 가장 간단한 방법 일 것입니다. 코드에 따라 파이프 라인을 구성하거나 각 "프레임"에 Parallel.For (또는 ForEach)을 사용할 수도 있습니다.

즉, 관리되지 않는 원시 코드를 고수하고 싶다면 Microsoft의 새로운 Parallel Patterns Library 또는 Intel's Threading Building Blocks을 사용하는 것이 좋습니다. 그들은 둘 다 새로운 TPL과 유사한 구조를 가지고 있습니다. 특히 데이터 병렬성을 위해, 그리고 "각 프레임이 다른 프레임에 의존하지 않는 한", 이것은 상당히 평행하게 만듭니다.

+0

나를 이길! Ade Miller는 TechEd에서 .Net 4.0과 함께 사용할 수있는 병렬 처리 옵션에 대해 좋은 대화를 나눴습니다. http://www.msteched.com/2010/NorthAmerica/ARC205 – Mathias

+0

PPL은 내가 찾고있는 것, 감사합니다. 하나의 질문이지만, C#과 같은 관리 코드를 사용하면 눈에 띄지 않는 속도로 코드를 느리게 처리 할 수 ​​있습니다. 훨씬 단순화 된 프로그래밍 환경을 좋아하지만 비디오 처리와 같은 것들은 가비지 수집과 오버 헤드 확인 오버 헤드에 대한 두려움 때문에 항상 주저합니다. 그냥 오래된 프로그래밍 프로그래밍 편집증 일 수도 있습니다. \ – Xzhsh

+0

Xzhsh : 저는 개인적으로 C# 및 관리 코드를 사용하여 "내 직업"에서 과학적 데이터 처리를합니다. 그것은 아주 잘하지만 perf입니다. 특성은 원시 코드와 다릅니다. 따라서 보상을 위해 사고 방식을 조정해야합니다. 나는 개인적으로 GC가 문제가되는 것에 대해 걱정하지 않을 것이지만, 배열 범위 검사는 당신의 속도를 늦출 수 있습니다 (이것은 비활성화 될 수 있습니다). 그러나 대부분의 경우 조심스럽게 프로파일 링하고 "양호한"관리 코드는 원시 코드보다 빠르며 때로는 빠를 수 있습니다. –

1

제 조언은 단계별로이 방법에 접근하는 것입니다.

  1. 먼저 MATLAB 이외의 기능을 구현했는지 확인하십시오. 이것은 사소한 일이며, 솔직히 말하자면, 성능에 대해 생각하기 전에 먼저 뇌 순환의 100 %를 정확성을 얻는 데 계획해야한다고 생각합니다.

  2. 솔루션을 분할하십시오 : 다른 구현과 분리 된 것으로 간주되는 루틴을 나머지 코드와 구문 론적으로 분리 할 수 ​​있음을 입증하십시오. 예를 들어, 광선 추적기에 대해 이야기하고 있다면, 하나의 픽셀을 통과하는 광선을 하나의 시점에서 촬영 한 결과를 일반적인 환경으로 가져올 수 있습니다. 이것은 실제로 공통적 인 것 (예 : 환경의 기하학, 텍스처 맵 등)과 독특한 상황 (예 : 눈에서 픽셀까지의 광선)에 특정한 것을 생각해야하므로 중요하지 않습니다. . 성능 프로파일 링은 여기에 친구입니다.

  3. 스레드/프로세스를 병렬로 생성하고 실행 한 후 실행하고 결과를 완료하는 데 필요한 라이브러리 또는 프레임 워크의 구문을 식별합니다. 참고 : 공유 데이터 등을 상호 배제해야합니다. 예를 들어 Java 환경에서는 java.util.concurrency이됩니다.

  4. 두 개의 스레드 만 만들어 작업을 절반으로 나누어보십시오. 초기 솔루션, N = 2 스레드에 대한 솔루션을 측정 할 수있게 해주는 벤치 마크를 작성하고 결과에서 벗어나 프로파일을 작성하십시오.

  5. 그런 다음에 만 추가 병렬 처리를 고려해야합니다.

당신이 다음과 같은 단계를 수행하면, 당신은의 (a) (b)의 일부 알려진 성능 측정에 작동 뭔가 및 (c)가 분명히 있고, 실제 작업 (MATLAB에서 포트)에 성공할 것 parallization 기회를 더 활용하려면 앞으로 나아가 야합니다.

+0

팁 Bob에게 감사드립니다! 저는 루틴을 대부분 C 언어로 포팅했습니다. 그리고 병렬 처리는 완전히 독립적 인 프레임 사이에만있을 것입니다. 나는 당신의 충고를 좋아한다. 내 다음 프로젝트에서 이것을 염두에 두어야한다. – Xzhsh

+0

내 그래픽에서 @Xzhsh, FYI는 최고의 병렬 처리가 개별 프레임에 독립적으로 전체 프레임을 할당하는 것이 아니라 실제로 프레임 단위로 작동한다. . 공유 환경은 픽셀을 다양한 스레드로 분할하고 단일 프레임 (결국 광선 추적기였습니다)의 계산 속도를 높이는 데 크게 기여했습니다. 접근법의 선택은 프로젝트의 일부로 조사 할 수있는 또 다른 좋은 주제 일 것입니다. –

관련 문제