2013-02-05 2 views
0

그물에 누군가가 다음과 같은 C# 코드를 Parallel.for (멀티 코어 시스템 용)로 변환 할 수 없다고 했습니까? 그렇다면 더 이상 최적화 할 수있는 더 좋은 방법이 있습니까? 감사TPL 및 Parallel.for

  for (int i = 0; i < 4; i++) 
      { 
       var tmp = i; 
       tasks[i] = Task.Factory.StartNew(() => Console.WriteLine(tmp)); 
      } 
+3

그'tasks' 배열로 무엇을하려합니까? 이 작업은 실제 작업 세트입니까, 콘솔에 4 번 쓰는 것입니까? 단 4 번의 반복으로, 새로운 스레드를 시작하는 오버 헤드가 병렬 작업에서 얻는 이득보다 더 많이 겪게 될 것입니다. –

+0

참고로, Parallel.For에는 많은 오버 헤드가 있습니다. 실제로 측정하지 않고 속도가 빠르거나 스로틀 링이 필요하다면 Task.Run을 사용하여 루프를 풀고 작업을 시작하는 것이 좋습니다. 너,하고있어, –

답변

1

글쎄, 당신은 Parallel.For 당신을 위해 할 것 끝에 Tast.WaitAll(tasks)을하지 않아도, 그래서 당신은 당신의 질문에 그 코드를 삽입하지 않는 한 당신은 꽤 (Parallel.For이하고있는 일을하지 않습니다. 그럼 다음 줄은 코드가)

Parallel.For(0,4, (i) => Console.WriteLine(i)); 

이외의 Parallel.For 루프 등과 같을 것이다 것입니다 경우 Parallel.For로 변환 할 수없는 이유, 내가 볼 수 없습니다. 그 사람이 그것을 바꿀 수 없다는 이유는 무엇입니까?

+0

예 TaskWaitAll을 가지고 있지만 모든 코드를 게시하지 않았습니다. 코드 라인 감사합니다! – user2023152

+0

작동하지 않았습니다. 그것은 잘 실행했지만 너무 많은 오류를 컴파일했습니다. – user2023152

+0

어떤 오류가 발생 했습니까? –

0

외부 루프 코드가 없으므로 여기 어둠 속에서 찌르다.

var iterations = 100; 
var stopwatch = new Stopwatch(); 

// Run Serial version 
stopwatch.Start();  
for(int i = 0; i < iterations; i++) 
{ 
    for (int i = 0; i < 4; i++) 
    { 
     Console.WriteLine(tmp); 
    } 
} 

stopwatch.Stop(); 
var serialTime = stopwatch.ElapsedMilliseconds; 
stopwatch.Reset(); 

// Run parallel version 
stopwatch.Start(); 

for(int i = 0; i < iterations; i++) 
{ 
    Parallel.For(0,4, (i) => Console.WriteLine(i));  
} 

stopwatch.Stop(); 

var parallelTime = stopwatch.ElapsedMilliseconds; 

Console.WriteLine("Serial took : {0}ms", serialTime/(double)iterations); 
Console.WriteLine("Parallel took: {0}ms", parallelTime/(double)iterations); 

이가 있기 때문에 속도 향상을 측정하기위한 좋은 테스트하지 않을 수 있습니다 : 당신은 단지 전체 평균 실행 시간을 측정하는 경우는 직렬 및 병렬 버전을 측정하기 위해이 같은 것을 사용할 수, 작업을 저장 할 필요가 없습니다 작업량이 매우 가볍습니다. 보다 많은 오버 헤드를 가진 함수를 호출하거나 더 많은 작업을 모방하려고 Thread.Sleep과 같은 함수를 호출 해 볼 수 있습니다. 또한 Amhahl의 Law speed up을 C#으로 측정하는 방법에 대한 내 대답 This StackOverflow Question을 참조하십시오.

+0

고맙습니다. 이는 좋은 예이지만 작업은 다른 성능상의 이유로 필요합니다. 전자 메일로 연락 할 수있는 방법이 있습니까? 두 가지 CPU 사용률 그래프를 보내 주시면 어떻게되는지 설명 할 수 있습니다. – user2023152

+2

질문을 업데이트하고 그래프를 업로드하여 모든 사람이 혜택을 누릴 수 있도록하는 것이 좋습니다. StackOverflow에는 공개 채팅 기능 (공개)이 있으므로 누구나 혜택을 누릴 수 있습니다. 이것이 바로이 사이트의 요점입니다. –

0

첫째, 오류에 대해보고 :

처리되지 않은 예외 : System.AggregateException : 하나 이상의 erroros가 발생합니다. System.ArgumentExcpetion : 태스크 배열 inclue 이름 paraemeter 적어도 하나 개의 널 (null) 요소 : 작업

오류, 그것은 당신의 Task.WaitAll 호출에 의해 매우 명확 발생한다 - 그것이 당신의 tasks 배열에서 작업 슬롯 중 하나가 말한다 없는.

둘째, Console.WriteLine의 성능을 측정하는 두 가지 이유로 나쁜 :

  1. 작업 부하가 너무 밝 : 내가 설정 오버 헤드가 실제 작업 난쟁이 것이라고 추측하고있다;
  2. Console.WriteLine은 동기화됩니다. 즉, 모든 작업이 시작된 다음 즉시 동기화된다는 것을 의미합니다. 맵 축소 API를 사용하는 것이 절대적으로 부적합한 경우입니다. 대신 실제 컴퓨팅 작업량을 설계하십시오 (예 : 소수 계산).