Go не связывает мою сборку: неопределенная внешняя функция


Я пытаюсь написать некоторые SIMD в основном для учебных целей. Я знаю, что Go может связать сборку, но я не могу заставить ее работать правильно.

вот самый минимальный пример, который я могу сделать (поэлементное векторное умножение):

vec_amd64.s (Примечание: фактический файл имеет пробел под RET так как это приводит к ошибкам иначе)

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

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.иди

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

The go env команда сообщает my GOHOSTARCH на amd64 и моя версия Go будет 1.3. Чтобы подтвердить, что это не была архитектура, вызывающая проблему, я нашел другой пакет, который использует сборку и удалил все файлы сборки, кроме _amd64.s один и его тесты побежали штраф.

Я также попытался изменить его на экспортированный идентификатор в случае, если это вызывало странности, но не кости. Я думаю, что я довольно внимательно следил за шаблоном в пакетах, таких как math/big, так что надеюсь, это что-то простое и очевидное, что я упускаю.

Я знаю, что идти по крайней мере попытка чтобы использовать сборку, потому что если я введу синтаксическую ошибку.s файл инструмент сборки будет жаловаться на это.

Edit:

будет чисто,go build будет компилироваться чисто, но go test вызывает появление ошибки.

1 79

1 ответ:

вы используете не ту точку. вместо

TEXT .mul(SB),4,-48

написать

TEXT ·mul(SB),4,-48

и все работает просто отлично.