12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- // Copyright © 2021 Jeffrey H. Johnson <trnsz@pobox.com>.
- // Copyright © 2021 Gridfinity, LLC.
- // Copyright © 2019 Neal.
- // Copyright © 2018 lrita@163.com.
- //
- // Use of this source code is governed by the MIT
- // license that can be found in the LICENSE file.
- //go:build linux
- // +build linux
- package gonuma_test
- import (
- "runtime"
- "sync"
- "testing"
- gonuma "github.com/johnsonjh/gonuma"
- "github.com/stretchr/testify/require"
- )
- func TestGetNodeAndCPU2(t *testing.T) {
- if !gonuma.NUMAavailable() || !gonuma.NUMAfastway {
- t.Skip("not available or fastwway")
- }
- var (
- nodem = gonuma.NewBitmask(gonuma.NodePossibleCount())
- mu sync.Mutex
- wg sync.WaitGroup
- assert = require.New(t)
- )
- gonuma.NUMAfastway = false
- defer func() { gonuma.NUMAfastway = true }()
- cpum := make([]gonuma.Bitmask, gonuma.NodePossibleCount())
- for i := 0; i < len(cpum); i++ {
- cpum[i] = gonuma.NewBitmask(gonuma.CPUPossibleCount())
- }
- for i := 0; i < gonuma.CPUCount(); i++ {
- wg.Add(1)
- go func() {
- defer wg.Done()
- for i := 0; i < 100; i++ {
- cpu, node := gonuma.GetCPUAndNode()
- mu.Lock()
- cpum[node].Set(cpu, true)
- nodem.Set(node, true)
- mu.Unlock()
- runtime.Gosched()
- }
- }()
- }
- wg.Wait()
- for i := 0; i < (2 * gonuma.CPUCount()); i++ {
- wg.Add(1)
- go func() {
- defer wg.Done()
- cpu, node := gonuma.GetCPUAndNode()
- t.Logf("TestGetNodeAndCPU2 cpu %v node %v", cpu, node)
- }()
- }
- wg.Wait()
- nmask := gonuma.NodeMask()
- for i := 0; i < nodem.Len(); i++ {
- if !nodem.Get(i) {
- continue
- }
- assert.True(nmask.Get(i), "node %d", i)
- cpumask, err := gonuma.NodeToCPUMask(i)
- assert.NoError(err)
- cmask := cpum[i]
- for j := 0; j < cmask.Len(); j++ {
- if !cmask.Get(j) {
- continue
- }
- assert.True(cpumask.Get(j), "cpu %d @ node %d", j, i)
- }
- }
- }
|