2013-06-28 2 views
0

배열에서 Max 값을 얻기위한 두 가지 다른 방법을 찾았지만 병렬 프로그래밍이 정말 좋아지지 않으므로 실제로 이해하지 못합니다.이 메소드는 어떤 기능을합니까?

나는이 방법이 똑같은 일을하는지 궁금한가요? 나는 그 (것)들에 관하여 다량 정보가 진짜로 없다. 심지어 의견 ...

첫 번째 방법 :

int[] vec = ... (I guess the content doesn't matter) 

static int naiveMax() 
{ 
    int max = vec[0]; 
    object obj = new object(); 

    Parallel.For(0, vec.Length, i => 
    { 
     lock (obj) { 
       if (vec[i] > max) max = vec[i]; 
     } 
    }); 

    return max; 
} 

그리고 두 번째 :

static int Max() 
{ 
    int max = vec[0]; 
    object obj = new object(); 

    Parallel.For(0, vec.Length,  //could be Parallel.For<int> 
     () => vec[0], 
     (i, loopState, partial) => 
    { 
     if(vec[i]>partial) partial = vec[i]; 
     return partial; 
    }, 
    partial => { 
      lock (obj) { 
        if(partial > max) max = partial; 
      } 
    }); 
    return max; 
} 

이 동일하거나 뭔가 개의 다른과 무엇을해야합니까? 고마워;)

+0

저 자물쇠에 회전하는 엄청난 양이있을 것 같은 저에게 보입니다./당신은 그것들을 모두 시험해보고 그 차이를 보지 그래요? –

+4

두 방법 모두 병렬 코드를 순차적으로 실행하여 많은 리소스를 낭비합니다. – dtb

+1

잠금을 사용하지 않아도 (순차 코드가 병렬이 아니기 때문에) 작은 계산은 병렬 실행에 가장 적합하지 않습니다. 오버 헤드는 계산에 사용 된 시간보다 높습니다. –

답변

2

둘 다 정수 배열에서 최대 값을 찾습니다. 최대 값을 더 빨리 찾으려면 Parallel.For Method을 사용하여 "병렬로"수행하십시오. 두 방법 모두 실패합니다.

이것을 보려면 먼저 충분히 큰 정수 배열이 필요합니다. 작은 배열의 경우 병렬 처리로도 속도가 향상되지 않습니다.

int[] values = new int[100000000]; 
Random random = new Random(); 
for (int i = 0; i < values.Length; i++) 
{ 
    values[i] = random.Next(); 
} 

이제 우리는 두 가지 방법을 실행할 수 있습니다.

naiveMax 00:06:03.3737078 
Max  00:00:15.2453303 

그래서 Max은 다음과 적절한 성능 측정 설정 (Stopwatch, 100,000,000 정수, 100 반복, 출시 빌드, 부착 디버거, JIT 워밍업의 배열) 내 컴퓨터에서 다음과 같은 결과를 얻을 사용 많이보다 naiveMax (6 분! 기침)보다 좋습니다.

하지만 어떻게 말하면, PLINQ과 비교할 수 있을까요? 나쁜

static int MaxPlinq(int[] values) 
{ 
    return values.AsParallel().Max(); 
} 
MaxPlinq 00:00:11.2335842 

은 몇 초를 저장. 이제 일반, 이전, 순차적 인 for 루프를 비교해보십시오.

static int Simple(int[] values) 
{ 
    int result = values[0]; 
    for (int i = 0; i < values.Length; i++) 
    { 
     if (result < values[i]) result = values[i]; 
    } 
    return result; 
} 
Simple  00:00:05.7837002 

는 우리가 승자가 생각합니다.

학습 한 내용 : Parallel.For은 코드를 에 뿌려서 마술처럼 빠르게 실행할 수있는 먼지가 아닙니다. 성능 문제는, 올바른 도구와 측정, 측정, 측정을 ... 사용하는 경우

그들은 같은 일을 표시
+0

고마워. 이것은 내 코드가 아니기 때문에 이해하지 못했습니다. Parallel Computation에 대한 슬라이드를 읽는 중이었습니다.이 방법을 발견했습니다. 이제는 diference가 최대 값을 찾는 데 걸리는 시간에만 있다는 것을 알 수 있습니다. – SaintLike

0

그러나 그들은 매우 비효율적이다. 병렬 처리의 포인트는 독립적으로 실행할 수있는 코드의 속도를 향상시키는 것입니다. 경쟁 조건으로 인해 (여기에 구현 된대로) 최대 값을 발견하면 실제 논리에 대한 원자 세마포어/잠금이 필요합니다. 즉, 어쨌든 순차적으로 코드를 수행하기 위해 많은 스레드와 관련 리소스를 돌리고 있음을 의미합니다. 전적으로 병렬화의 목적.

관련 문제