Description
Hi everyone,
while experimenting with the language and trying to port a LU factorization benchmark from the Barcelona OpenMP Tasks Suite written in C, I got fatal error: acquirep: invalid p state on an AMD 48-core machine (Opteron 6172).
I've tried to strip the code to the bare minimum that triggers the error. That's a bit difficult, because the problem is highly undeterministic, and removing code that I presume to be irrelevant for a race condition just never triggers it. This version seems to trigger it quite reliably, in 50%-80% of the runs.
I've compiled it with go build (go 1.4.2) and ran the executable in a for loop in bash:
package main
import (
"flag"
"fmt"
"runtime"
"sync"
)
var matrixSize, submatrixSize int
/***********************************************************************
* genmat:
**********************************************************************/
func genmat(M []*[][]float32) {
var null_entry bool
for ii := 0; ii < matrixSize; ii++ {
for jj := 0; jj < matrixSize; jj++ {
null_entry = false
if (ii < jj) && (ii%3 != 0) {
null_entry = true
}
if (ii > jj) && (jj%3 != 0) {
null_entry = true
}
if ii%2 == 1 {
null_entry = true
}
if jj%2 == 1 {
null_entry = true
}
if ii == jj {
null_entry = false
}
if ii == jj-1 {
null_entry = false
}
if ii-1 == jj {
null_entry = false
}
if null_entry == false {
subMatrix := make([][]float32, submatrixSize)
for i := range subMatrix {
subMatrix[i] = make([]float32, submatrixSize)
}
M[ii*matrixSize+jj] = &subMatrix
} else {
M[ii*matrixSize+jj] = nil
}
}
}
}
func sparselu_init(pBENCH *[]*[][]float32, pass string) {
*pBENCH = make([]*[][]float32, matrixSize*matrixSize)
genmat(*pBENCH)
}
func sparselu_par_call(BENCH []*[][]float32) {
var wg sync.WaitGroup
for kk := 0; kk < matrixSize; kk++ {
for ii := kk + 1; ii < matrixSize; ii++ {
if BENCH[ii*matrixSize+kk] != nil {
for jj := kk + 1; jj < matrixSize; jj++ {
if BENCH[kk*matrixSize+jj] != nil {
//#pragma omp task untied firstprivate(kk, jj, ii) shared(BENCH)
wg.Add(1)
jj := jj
go func(wg *sync.WaitGroup) {
defer (*wg).Done()
if BENCH[ii*matrixSize+jj] == nil {
subMatrix := make([][]float32, submatrixSize)
// go-style initializing 2d matrix in a loop
for i := range subMatrix {
subMatrix[i] = make([]float32, submatrixSize)
}
BENCH[ii*matrixSize+jj] = &subMatrix
}
for i := 0; i < submatrixSize; i++ {
for j := 0; j < submatrixSize; j++ {
for k := 0; k < submatrixSize; k++ {
}
}
}
}(&wg)
}
}
wg.Wait()
}
}
}
}
func main() {
runtime.GOMAXPROCS(47)
flag.IntVar(&matrixSize, "n", 50, "Matrix size")
flag.IntVar(&submatrixSize, "m", 100, "Submatrix size")
flag.Parse()
var matrixPar []*[][]float32
sparselu_init(&matrixPar, "Parallel")
sparselu_par_call(matrixPar)
fmt.Println("Program ended")
}
Now I'm aware that this isn't idiomatic go, at all, it's a quite literal transliteration of the C version, but nevertheless, I guess the go runtime shouldn't crash like this:
for i in {1..15}; do bin/sparselu-crash-mwe -n 201 -m 69; done
acquirep: p->m=0xc20db16380(38) p->status=1
fatal error: acquirep: invalid p state
runtime stack:
runtime.throw(0x562667)
/usr/local/go/src/runtime/panic.go:491 +0xad
acquirep(0xc208062400)
/usr/local/go/src/runtime/proc.c:2747 +0x10d
stopm()
/usr/local/go/src/runtime/proc.c:1186 +0x1b2
findrunnable(0xc208062400)
/usr/local/go/src/runtime/proc.c:1487 +0x562
schedule()
/usr/local/go/src/runtime/proc.c:1575 +0x151
goexit0(0xc2119ab680)
/usr/local/go/src/runtime/proc.c:1717 +0x16e
runtime.mcall(0x42e3c4)
/usr/local/go/src/runtime/asm_amd64.s:186 +0x5a
goroutine 1 [semacquire]:
sync.(*WaitGroup).Wait(0xc20d1e38a0)
/usr/local/go/src/sync/waitgroup.go:132 +0x169
main.sparselu_par_call(0xc2080ae000, 0x9dd1, 0x9dd1)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:96 +0x274
main.main()
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:112 +0x11f
goroutine 531203 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531207 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531185 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531210 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531224 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531186 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531195 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531213 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531219 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531191 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531187 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531194 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531220 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531225 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531184 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531176 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531200 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531208 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531182 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531214 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531189 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531221 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531174 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531211 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531205 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531222 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531178 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 530478 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531212 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531202 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531192 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531172 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 530480 [runnable]:
sync.(*WaitGroup).Done(0xc20d1e38a0)
/usr/local/go/src/sync/waitgroup.go:84
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x2e5
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531169 [runnable]:
sync.(*WaitGroup).Done(0xc20d1e38a0)
/usr/local/go/src/sync/waitgroup.go:84
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x2e5
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531188 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531171 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531206 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531216 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 530479 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531175 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531179 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 530477 [runnable]:
sync.(*WaitGroup).Done(0xc20d1e38a0)
/usr/local/go/src/sync/waitgroup.go:84
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x2e5
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531197 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531223 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531183 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531181 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531209 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531217 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531180 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531190 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 530476 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531218 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531170 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531173 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531215 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531193 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531196 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531201 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531199 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531204 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531177 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
goroutine 531198 [runnable]:
main.func·001(0xc20d1e38a0)
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:77
created by main.sparselu_par_call
/home/stsimon/golang-parallel/src/benchmarks/sparselu-crash-mwe.go:93 +0x247
Inlining or reducing the genmat() function to trivial cases seems to stop provoking the crash.
I can't reproduce this on an Intel 2-core CPU (i3/i5).
Am I doing something completely wrong here, or is this a legitimate runtime bug? How can I debug this further?
Thank you,
Artjom