|
我试着写一些 SIMD,主要用于学习目的。我知道 Go 可以链接程序集,但我不能让它正常工作。 P1 K8 d/ i0 F7 D2 g. e3 C7 f" P
这是我能做的最简单的例子(逐元素向量乘法):+ R/ [2 ]+ a1 K: r' b9 _' D7 E
vec_amd64.s(注:实际文件下有一条空白线,RET否则会导致错误)
6 k5 t& R- f9 Z' l) ]// 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) RET2 J, t/ `9 o6 K- m% N9 O7 y: l
vec.go
) \9 a3 e2 c8 m% i/ spackage 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; p0 ], P! Z5 o
simd_test.go
h3 {# [+ n8 l
% V7 S3 t+ W$ W% ~- 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.mul9 K2 k8 K+ w* s
该go env命令报告我GOHOSTARCH要amd64和我的围棋版本是1.3.为了确认这不是一个导致问题的架构,我发现了另一个使用程序集的包,并删除了它_amd64.s除所有程序集文件外,其测试运行良好。
4 j: U2 J) R$ Z3 }# t我还试图将其更改为导出的标志符,以防止奇怪,但没有骰子。我想我非常密切地遵循了 包中的模板math/big,所以希望这是我遗漏的简单明了的东西。
, u% w/ P+ p' }( x+ Q2 M. i) j1 m我知道 Go 至少在尝试如果我在 .s 将语法错误引入文件中,建筑工具会抱怨。
t( |4 |1 b- V' \3 P编辑:: b! w* U g1 d1 N h. B* H
要清楚,go build但是go test会导致错误。
; D* p. j! g* T* ?3 c
) u+ U5 c/ Q, y4 o6 P 解决方案:
2 x+ J. b4 _* v2 _3 p% V) P 你用错了点。8 X* }+ _8 D1 Z3 ?: I8 R W
TEXT .mul(SB),4,$0-483 {8 ?" y# @7 N" C0 D$ H
写
( R& r1 u+ m+ Q) D) R; H w' F5 v9 M( x4 tTEXT ·mul(SB),4,$0-48
& R/ e* N/ W9 C+ l# C+ A8 ` 一切正常。 |
|