作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
使用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字节对齐