1. ホーム
  2. assembly

[解決済み] Go が私のアセンブリをリンクしてくれません: 外部関数が未定義です

2023-07-14 01:42:45

質問

主に学習用にSIMDを書こうとしています。Go がアセンブリをリンクできることは知っていますが、正しく動作させることができません。

私が作れる最も最小限の例です(要素ごとのベクトル乗算)。

vec_amd64.s (注意: 実際のファイルでは、空白行が RET の下に空白行があります。)

// func mul(v1, v2 Vec4) Vec4
TEXT .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

vec.go

package simd

type Vec4 [4]float32

func (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

simd_test.go

package simd

import (
    "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 というエラーが出ます。

# testmain
simd.TestMul: call to external function simd.mul
simd.TestMul: undefined: simd.mul

go env コマンドは、私の GOHOSTARCH であることを報告します。 amd64 で、Go のバージョンは 1.3 になっていました。アーキテクチャが原因でないことを確認するため、アセンブリを使用する別のパッケージを見つけ、アセンブリ ファイルをすべて削除しました。 _amd64.s を除くすべてのアセンブリ ファイルを削除し、そのテストは正常に実行されました。

私はまた、それが奇妙なことを引き起こしている場合に備えて、エクスポートされた識別子に変更しようとしましたが、失敗しました。私は、以下のようなパッケージのテンプレートにかなり忠実に従ったと思います。 math/big のようなパッケージのテンプレートにかなり忠実に従ったと思うので、私が見逃しているのが何か単純で明白なものであることを望みます。

私は、Go が少なくとも を試しています。 を使用していることがわかります。.s ファイルに構文エラーを導入すると、ビルドツールはそれについて文句を言います。

編集してください。

明確にするために go build はきれいにコンパイルされますが go test はエラーが表示されます。

解決方法は?

ドットの使い方が間違っています。

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

書く

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

で、すべてうまくいきます。