2014-02-25 2 views
3

나는 약간 혼란스러운이 간단한 질문을 얻었다. 저는 2 개의 프로세서를 가지고 있습니다 33.0360723에서 각각 10 억 개의 작업을 개별적으로 수행 할 수 있습니다. 그러나 둘 다 함께 27.4996964의 작업을 수행합니다.이상하게 작동하는 처리 속도

하나의 프로세서에 대한 작업 시간이 X라면 둘 다 함께 X/2가되지 않아야합니까?

내 코드 :

Function calc(ByVal i As Integer, ByVal result As String) 
    Math.Sqrt(i) 
    Return True 

End Function 
Sub Main() 
    Dim result As String = Nothing 


    Dim starttime As TimeSpan 
    starttime = DateTime.Now.TimeOfDay 
    For i = 0 To 1000000000 
     calc(i, result) 
    Next 
    Console.WriteLine("A single processor runs 1 billion operations in: ") 
    Console.WriteLine(DateTime.Now.TimeOfDay - starttime) 



    starttime = DateTime.Now.TimeOfDay 

    Parallel.For(0, 1000000000, Function(i) calc(i, result)) 

    Console.WriteLine("All your processors run 1 billion operations in: ") 
    Console.WriteLine(DateTime.Now.TimeOfDay - starttime) 
    Console.ReadLine() 

End Sub 

PS : 나는 VB.net이에 대한 코드를했다.

+2

코드를 보여주세요! 대부분의 경우에는 실제 작업보다 두 프로세서의 동기화에 훨씬 많은 오버 헤드가 있습니다. – Aron

+1

두 번째 프로세서가 하이퍼 스레딩 가상 프로세서입니까? –

+0

이것은 좋은 질문이므로 닫아서는 안됩니다. – xpda

답변

1

사람이 30 분 안에 2 마일을 걸을 수 있다면 동일한 2 마일을 걷는 데 얼마나 걸립니까?

MSDN의 문서는 다음과 같습니다. for (Visual Basic의 경우) 루프를 실행하여 MAY이 병렬로 실행되는 루프를 실행합니다. 여기에 키워드는 MAY입니다.

CLR이 작업하고 경험하도록하면 CLR이 생각했던대로 작동하지 않습니다.

내 경우에는 (복사 붙여 넣기 코드) 단일 프로세서 - 21.495 초, 모든 프로세서 : 7.03 초. 32 비트 Windows 7에 i7 870 CPU가 있습니다.

+0

당신의 농담은 실제로 유효하지 않을 것이며, 각 사람은 2 마일을 걸어가려면 1 마일을 걸어야 할 것입니다. –

+0

최소한 결과를 사용하지 않기 때문에 루프를 nops로 최적화하지 않습니다. 예외는 가능하지 않다는 것을 인식해야하지만 [음수가 아닌 값]이됩니다. 컴파일러 (그리고 더 많은 런타임 환경)가 마이크로 벤치 마크를 깨뜨릴 수 있습니다. –

0

Parallel.For에서 반복 순서는 반드시 루프 순서와 같지 않습니다.

또한 귀하의 기능은 sqrt(i)입니다. 이는 하나의 프로세서가 sqrt(smallernumbers)이고 다른 하나가 sqrt(largernumbers) 일 수 있음을 의미합니다.

간단한 대답은 각 프로세서에서 수행 한 작업이 사용자가 준 전체 작업의 절반이 아니므로 평등하지 않을 수 있습니다.

하나의 프로세서가 더 많은 작업을 수행하고 다른 프로세서가 작업을 완료하고 다른 프로세서를 기다렸을 수 있습니다. 또는 프로세서 중 하나가 운영 체제에 의해 preempted되었을 수 있습니다 작업 스레드가 기다리고있을 수있는 동안 몇 가지 중요한 것들을 할 수 있습니다.

관련 문제