|
我试着写一些 SIMD,主要用于学习目的。我知道 Go 可以链接程序集,但我不能让它正常工作。2 c! K* Z. J2 i4 A' I2 [
这是我能做的最简单的例子(逐元素向量乘法):
. I1 ]6 m) D$ S# O6 Q( p) c" w4 vvec_amd64.s(注:实际文件下有一条空白线,RET否则会导致错误)
% L; S$ `: x; Q$ o. H// func mul(v1,v2 Vec4) Vec4TEXT .mul(SB),4,$0-48 MOVUPS v1 0(FP), X0 MOVUPS v2 16(FP),X1 MULPS X1,X0 / also tried ret 32 since I've seen some places do that MOVUPS X0,toReturn 32(FP) RET5 s$ Q. B) m8 W+ K; h, ?" r. R( j
vec.go
3 g _, I" B7 zpackage simdtype Vec4 [4]float32func (v1 Vec4) Mul(v2 Vec4) Vec4 { return Vec4{v1[0] * v2[0],v1[1] * v2[1],v1[2] * v2[2],v1[3] * v2[3]}}func mul(v1,v2 Vec4) Vec4
4 ^: P& g& K0 X" V4 p simd_test.go
! [# }% x2 F5 u
# C& a8 w1 w0 F, M2 C- package simdimport "testing")func TestMul(t *testing.T) v1 := Vec4{1,2,3,4}v2 := Vec4{5,6,7,8}res := v1.Mul(v2) res2 := mul(v1,v2) / Placeholder until I get it to compile if res != res2 t.Fatalf("Expected %v; got %v",res,res2) }code]当我试着操作的时候go test出现错误:[code]# testmainsimd.TestMul: call to external function simd.mulsimd.TestMul: undefined: simd.mul: Z' D# D2 R& w( o
该go env命令报告我GOHOSTARCH要amd64和我的围棋版本是1.3.为了确认这不是一个导致问题的架构,我发现了另一个使用程序集的包,并删除了它_amd64.s除所有程序集文件外,其测试运行良好。
) E W; _6 Y: u& f2 u7 h7 ~我还试图将其更改为导出的标志符,以防止奇怪,但没有骰子。我想我非常密切地遵循了 包中的模板math/big,所以希望这是我遗漏的简单明了的东西。( V* h& \* T6 O5 m4 k
我知道 Go 至少在尝试如果我在 .s 将语法错误引入文件中,建筑工具会抱怨。
6 w% I$ g) G/ O9 ~% N' D" ?1 P% J编辑:3 G9 O5 E8 D6 R
要清楚,go build但是go test会导致错误。
, J# y5 ?+ z8 ^ ~! F; K. X6 A& u
+ e3 X) v( |) M5 k. f 解决方案:
4 }6 ^7 _( i% |# E2 g. h$ ] 你用错了点。; N' u; ~) I9 e) W0 @% d- D
TEXT .mul(SB),4,$0-48
( }( y: A0 E- V 写: K5 K: j R( W) `. ]) N
TEXT ·mul(SB),4,$0-481 T& j; C: B+ I' Y
一切正常。 |
|