为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕尼黑8549860 2021-08-10 17:02:22
我正在尝试编写一些 SIMD,主要用于学习目的。我知道 Go 可以链接程序集,但我无法让它正常工作。这是我能做的最简单的例子(逐元素向量乘法):vec_amd64.s(注意:实际文件下面有一个空白行,RET否则会导致错误)// 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)    RETvec.gopackage 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) Vec4simd_test.gopackage 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)    }}当我尝试运行时go test,出现错误:# testmainsimd.TestMul: call to external function simd.mulsimd.TestMul: undefined: simd.mul该go env命令报告 my GOHOSTARCHto beamd64和我的 Go 版本为 1.3。为了确认这不是导致问题的架构,我发现了另一个使用程序集的包并删除了除_amd64.s一个之外的所有程序集文件,并且其测试运行良好。我还尝试将其更改为导出的标识符,以防导致奇怪,但没有骰子。我认为我非常密切地遵循了math/big.我知道 Go 至少在尝试使用程序集,因为如果我在 .s 文件中引入语法错误,构建工具会抱怨它。编辑:要清楚,go build会编译干净,但go test会导致错误出现。
查看完整描述

1 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

您使用了错误的点。代替

TEXT .mul(SB),4,$0-48

TEXT ·mul(SB),4,$0-48

一切正常。


查看完整回答
反对 回复 2021-08-10
  • 1 回答
  • 0 关注
  • 195 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信