Goがアセンブリをリンクしていません:未定義の外部関数


82

私は主に学習目的でいくつかの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コマンドは、myが1.3で、Goバージョンが1.3であるGOHOSTARCHことamd64を報告します。問題の原因がアーキテクチャではないことを確認するために、アセンブリを使用する別のパッケージを見つけ、_amd64.s1つを除くすべてのアセンブリファイルを削除し、そのテストは正常に実行されました。

また、奇妙な原因になっている場合に備えて、エクスポートされた識別子に変更してみましたが、サイコロはありませんでした。のようなパッケージのテンプレートにかなり厳密に従っていると思うmath/bigので、うまくいけば、私が欠けているのは単純で明白なものです。

Goは少なくとも .sファイルに構文エラーを導入するとビルドツールが文句を言うアセンブリを使用しようとしています。

編集:

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


go buildきれいに終了し、go test失敗します。
linearZoetrope 2014

1
どのようにコンパイルしますか?あなたはその質問に答えませんでした。
fuz 2014

1
ソースファイルに関連して、どのディレクトリからどのコマンドを入力しましたか?ビルドツールを使用してコンパイルしgoます。非常にあいまいです。それは何を意味するかもしれません。
fuz 2014

1
go buildgo build foo.goなどには違いがあります。また、などにファンキーな設定がある可能性もあります$GOPATH正確に何をしたかについて書くほど、手助けがしやすくなります。最良の方法は、散文の代わりにシェルセッションのトランスクリプトを投稿することです。
fuz 2014

12
囲碁言語は本当に中黒文字にフェチを持っているようです。関連:関数名とプロトタイプのスラッシュとドット?
コーディグレイ

回答:


96

間違ったドットを使用しています。の代わりに

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

書く

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

そして、すべてがうまく機能します。


11
さて、それは微妙でした、私はそれが中黒であることに気づきませんでした。ありがとう。
linearZoetrope 2014

13
アメリカのQWERTYキーボードでどのように入力しますか?または、これは一般的なユースケースではなく、必要に応じてシンボルをグーグルで検索できますか?
Seiyria 2014

9
このように。吸わない(つまりWindowsではない)OSは、QWERTYレイアウトの未使用のレイヤーをマップして、中黒のような文字を入力できるようにします。
fuz 2014

7
@FUZxxl FYI Alt-0183(テンキーを使用)はWindowsでも引き続き機能します。それほど良くはなく、通常はラップトップでは困難ですが、機能します。
インターマーネット2014

4
Linux(少なくともUbuntu)で、コンポーズキーを有効にしている場合: <compose> ^ .=·
Izkata 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.