2011-01-11 6 views
0

배경 작업자를 사용하여 쿼드 코어 컴퓨터를 최대한 활용하는 방법을 알아 내려고하고 있습니다. 특히 여러 코어에서 실행되도록 지정해야합니까? 아니면 CRL이 스레드를 다른 코어에 자동으로 위임합니까? 또한 BGW의 여러 인스턴스를 실행할 수 있습니까? (이미 무한 루프를 실행하고 객체를 기본 스레드로 다시 전달하지만 다른 코어도 활용하는 것을 선호합니다).쿼드 코어 멀티 스레딩/BackgroundWork (C#)

내 프로젝트가 조금 다르다 고 생각하는 이유는 매우 인텐시브 한 두 개 이상의 작업이 없다는 것입니다. (병렬 프로그래밍을 사용하여 작업을 분할해야합니다.) 데이터를 가져오고 끊임없이 계산을 실행해야하는 매우 긴 루프 ...

모든 의견을 많이 보내 주시면 감사하겠습니다.

건배

답변

1

윈도우 스레드 스케줄러는 코어를 통해 바로 실행 스레드를 배포합니다. 그것은 전적으로 자동입니다.

3

루프를 병렬 처리하려면 .NET 4.0의 Parallel.For 또는 Parallel.Invoke (기능에 따라 다름) 기능을 매우 효과적으로 사용할 수 있으며, Parallel.Invoke는 가장 빠른 방법입니다 (심지어 백그라운드 작업자 스레드를 수동으로 생성하는 것보다 빠름).

1

런타임 라이브러리는 "올바른 작업을 수행합니다"(대부분). 보유한 코어 수를 결정하고 이에 따라 워크로드의 균형을 조정하려고 시도합니다.

귀하의 프로젝트가 모두 인데, 그 외에도은 많이 다릅니다. 우리가 볼 수있는 병렬 프로그래밍 예제의 대부분은 단일 작업을 수행하고 여러 코어가 작동 할 수 있도록 분할하는 것과 관련이 있지만, 현재 말하고있는 것과 같은 종류의 응용 프로그램이 많이 있습니다 . 예를 들어 파이프 라인 방식으로 여러 스레드를 실행하는 여러 응용 프로그램이 있습니다. 하나의 스레드는 입력 대기열 (파일에서 읽기, 데이터 압축 해제 및 레코드 배치), 하나의 스레드가 출력 대기열 (출력에서 레코드를 가져 와서 압축하고 디스크에 씁니다) 및 "주 스레드 "는 입력 대기열에서 읽고 레코드를 처리하며 출력 대기열에 씁니다. 여기서 제한적인 요소는 압축 및 디스크에 쓸 수있는 속도입니다.

문서에서는 일반적으로 짧은 작업에 BackgroundWorker을 사용하도록 권장하고 있지만, 전체 응용 프로그램을 실행하지 않는 경우 (예 : 스레드 풀을 다 써버린 경우) 이러한 응용 프로그램에서 제대로 작동 할 수 있습니다. 장시간 실행되는 스레드가 필요하고 스레드 풀을 많이 사용해야하는 경우 장기 실행 작업에 대해 자신의 비 풀 스레드 (System.Threading.Thread 클래스 사용)를 만드는 것이 좋습니다.