2017-02-17 4 views
0

두 개의 코드가 있으며 데스크톱에 32 개의 코어가 있습니다.원자 단위 연산이 별도의 스레드를 사용하는 것이 더 빠른 이유는 무엇입니까?

코드 A는

1) 원자 전역 변수에 값을 추가) 메모리 2의 어떤 임의의 위치에 값을 기록, 32 개 스레드를 사용하는 다음과 같은 일을한다.

코드 B는 16 개의 스레드를 사용하여 임의의 위치에 값을 쓰고 다른 16 개의 스레드를 사용하여 전역 변수에 값을 원자 적으로 추가합니다.

코드 B가 전역 변수에 대해 초당 실행되는 원자 연산의 횟수가 더 빠른 이유가 궁금했습니다. 여기

var a uint64 = 0 

const N = 10 * 1024 * 1024 

var data [N]uint64 

func main() { 

    for i := 0; i < 32; i ++ { 
     go func(id int) { 
      source := rand.NewSource(int64(id)) 
      local_rand := rand.New(source) 
      for { 
       atomic.AddUint64(&a, uint64(1)) 
       data[local_rand.Int31n(N)] = uint64(1) 
      } 
     }(i) 

    } 

    var b uint64 = 0 

    for { 
     c := atomic.LoadUint64(&a) 

     fmt.Println(c - b) 
     b = c 
     time.Sleep(time.Second) 
    } 

} 

여기 코드 B

var a uint64 = 0 

const N = 10 * 1024 * 1024 

var data [N]uint64 

func main() { 

    for i := 0; i < 16; i ++ { 
     go func(id int) { 
      source := rand.NewSource(int64(id)) 
      local_rand := rand.New(source) 
      for { 
       data[local_rand.Int31n(N)] = uint64(1) 
      } 
     }(i) 

    } 
    for i := 0; i < 16; i++ { 

     go func() { 
      for { 
       atomic.AddUint64(&a, uint64(1)) 
      } 

     }() 
    } 
    var b uint64 = 0 

    for { 
     c := atomic.LoadUint64(&a) 

     fmt.Println(c - b) 
     b = c 
     time.Sleep(time.Second) 
    } 

} 

답변

1

원자 조작 비싸다에게되는 코드이다. 원 자성을 유지하려면 해당 코드 블록에 대해 상호 배타적 인 실행을 보장해야합니다. 일반적으로로드 연결, 저장소 조건부 등과 같은 명령어를 사용하여 수행됩니다. 코드 A에는 32 개의 원자 연산이 있지만 코드 B에는 16 개만 있습니다. 원자 적 작업이 적고 실행 시간이 단축됩니다!

실험으로 코드 A에서 메모리 연산을 사용하여 원자 연산의 순서를 변경해보십시오 (메모리를 처음과 원자 단위로 나중에 수행하십시오). 실행 시간이 감소해야합니다.

+0

코드 A에서 스레드 수를 16으로 변경하면 성능이 향상되지 않는다고 생각합니다. – luyi0619

+0

제안한 내용과 다른 점은 없습니다. 먼저 원자력을 기억하십시오. 내가 놓친 게 있니? – luyi0619

+0

원자력을 우선하는 모든 스레드를 가지고 있다면, 그들은 모두 잠금 장치를 놓고 경쟁 할 것입니다. 먼저 메모리를 가지고 있다면, 그들은 모두 메모리를 먼저 할 것이지만, 캐쉬 된 것이 무엇이든간에, 메모리 동작은 다른 시간에 완료 될 것입니다. 이것은 원자 조작이 다른 시간에 시작됨을 의미합니다. 따라서 이전에 가지고 있던 것과 동일한 주장은하지 않을 것입니다. 그래서 나는 더 적은 실행 시간을 기대하고 있었다. 모든 데이터가 캐시 될 수 있습니다. 내가 예상했던대로하지 않습니다. 어쨌든 내 마음을 넘어서는 이론 일뿐입니다. –