두 개의 코드가 있으며 데스크톱에 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)
}
}
코드 A에서 스레드 수를 16으로 변경하면 성능이 향상되지 않는다고 생각합니다. – luyi0619
제안한 내용과 다른 점은 없습니다. 먼저 원자력을 기억하십시오. 내가 놓친 게 있니? – luyi0619
원자력을 우선하는 모든 스레드를 가지고 있다면, 그들은 모두 잠금 장치를 놓고 경쟁 할 것입니다. 먼저 메모리를 가지고 있다면, 그들은 모두 메모리를 먼저 할 것이지만, 캐쉬 된 것이 무엇이든간에, 메모리 동작은 다른 시간에 완료 될 것입니다. 이것은 원자 조작이 다른 시간에 시작됨을 의미합니다. 따라서 이전에 가지고 있던 것과 동일한 주장은하지 않을 것입니다. 그래서 나는 더 적은 실행 시간을 기대하고 있었다. 모든 데이터가 캐시 될 수 있습니다. 내가 예상했던대로하지 않습니다. 어쨌든 내 마음을 넘어서는 이론 일뿐입니다. –