• 公众号:一本正经的瞎扯

使用golang来调用SIMD指令,发现程序崩溃了:

__m128i xx =  _mm_load_si128((const __m128i_u *)p);

golang中的崩溃信息为:

unexpected fault address 0xffffffffffffffff
fatal error: fault
[signal 0xc0000005 code=0x0 addr=0xffffffffffffffff pc=0x1138995]

goroutine 19 [running]:
runtime.throw({0x1183aff?, 0xc000085860?})
	C:/Go/src/runtime/panic.go:992 +0x76 fp=0xc000051e50 sp=0xc000051e20 pc=0xfe89f6
runtime.sigpanic()
	C:/Go/src/runtime/signal_windows.go:261 +0x125 fp=0xc000051e98 sp=0xc000051e50 pc=0xffd0c5

传入C代码的指针为:

a := make([]byte, 0, 100)
ptr := unsafe.Pointer(&a[0])
__c_func(uintptr(ptr))

把指针按照8字节对齐,就不会崩溃了:

pointerValue := uint64(uintptr(ptr))
pointerValue = (pointerValue+7)/8*8
__c_func(uintptr(pointerValue))

结论:

  • golang中分配的对象,看起来是按照4字节对齐的
  • 使用SSE指令中的对齐加载,地址一定要按照8字节对齐