回答

收藏

Go 没有链接我的程序集:未定义的外部函数

技术问答 技术问答 405 人阅读 | 0 人回复 | 2023-09-11

我试着写一些  SIMD,主要用于学习目的。我知道 Go 可以链接程序集,但我不能让它正常工作。+ ?- D0 i1 K8 h
这是我能做的最简单的例子(逐元素向量乘法):
' d. X7 i3 `6 y6 u) j% Z' uvec_amd64.s(注:实际文件下有一条空白线,RET否则会导致错误)0 H1 |' s7 B  v2 ]# X
    // 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)    RET
    $ z6 _; J$ H0 |& X2 R; L" i
vec.go
* f) y& C9 v& r( k3 E
    package 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; x/ Y. [2 D1 f- h2 i  W- F
simd_test.go
8 J: ]& l: y8 ~

    ! E6 w9 n4 `' o- t4 H1 A. P
  • 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.mul5 g9 f5 F* S% P- t! x7 a) C; t
该go env命令报告我GOHOSTARCH要amd64和我的围棋版本是1.3.为了确认这不是一个导致问题的架构,我发现了另一个使用程序集的包,并删除了它_amd64.s除所有程序集文件外,其测试运行良好。+ p$ a6 |7 i6 r$ J- g
我还试图将其更改为导出的标志符,以防止奇怪,但没有骰子。我想我非常密切地遵循了 包中的模板math/big,所以希望这是我遗漏的简单明了的东西。
. p- R: h# ?) I; c7 V" N我知道 Go 至少在尝试如果我在 .s 将语法错误引入文件中,建筑工具会抱怨。4 N- T& a" M' v: H3 ?( M
编辑:+ [3 K7 r& L* t! v) L
要清楚,go build但是go test会导致错误。) x6 {& J7 D$ K- B6 T- |
                                                               
# v+ T" [+ D9 G    解决方案:                                                               
: s, [, N; J& G( F5 a0 C9 b0 U                                                                你用错了点。
7 q$ g% Q4 G9 ~
    TEXT .mul(SB),4,$0-48* Q: N% Y8 @1 p2 u9 G7 Q
: {: f# h8 V9 Z- S. {* _" I1 Z9 x
    TEXT ·mul(SB),4,$0-48
    ! f. e% X$ b+ [$ e8 O4 @
一切正常。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则