Git, derlememi bağlamıyor: tanımsız harici işlev


82

Çoğunlukla öğrenme amacıyla SIMD yazmaya çalışıyorum. Go'nun derlemeyi bağlayabileceğini biliyorum, ancak düzgün çalışmasını sağlayamıyorum.

İşte yapabileceğim en minimal örnek (eleman bazında vektör çarpımı):

vec_amd64.s (not: gerçek dosyanın altında bir boşluk satırı vardır, RETaksi takdirde hatalara neden olur)

// 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)
    }
}

Çalıştırmayı denediğimde go testşu hatayı alıyorum:

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

go envKomut raporlarımı GOHOSTARCHolmak amd64ve benim git sürüm 1.3 olmasını. Soruna neden olan mimarinin olmadığını doğrulamak için, assembly kullanan ve _amd64.sbiri dışındaki tüm derleme dosyalarını silen başka bir paket buldum ve testleri iyi sonuç verdi .

Ayrıca, tuhaflığa neden olan ancak zar içermeyen bir durumda dışa aktarılan bir tanımlayıcıya değiştirmeyi denedim. Sanırım şablonu gibi paketlerde oldukça yakından takip ettim math/big, bu yüzden umarım kaçırdığım basit ve açık bir şeydir.

Go'nun en azından derlemeyi kullanmaya çalıştığını biliyorum çünkü .s dosyasına bir sözdizimi hatası verirsem, yapı aracı bundan şikayet eder.

Düzenle:

Açık olmak gerekirse, go buildtemiz bir şekilde derlenecek, ancak go testhatanın görünmesine neden olacaktır .


go buildtemiz bitmiş, go testbaşarısız.
— LinearZoetrope

1
Nasıl derlersiniz? Soruya cevap vermedin.
— 2014

1
Kaynak dosyalarınıza göre hangi dizinden hangi komutları girdiniz? Derleme goaracını kullanarak derlerim. çok belirsiz. Herhangi bir şey ifade edebilir.
— 2014

1
Arama go buildile go build foo.govb. Arasında bir fark vardır . Ayrıca, sizin $GOPATHvb. Cihazlarınızda ilginç ayarlarınız da olabilir . Tam olarak ne yaptığınız hakkında ne kadar çok yazarsanız, size yardımcı olmak o kadar kolay olur. En iyisi, prosa yerine kabuk oturumlarının kopyalarını yayınlamaktır.
— 2014

12
Go dili gerçekten orta nokta karakteri için bir fetişe sahip gibi görünüyor. İlgili: İşlev adlarında ve prototiplerde eğik çizgiler ve noktalar?
— Cody Grey

Yanıtlar:


96

Yanlış noktayı kullanıyorsunuz. onun yerine

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

yazmak

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

ve her şey gayet iyi çalışıyor.


11
Bu ince bir şeydi, orta nokta olduğunu fark etmedim. Teşekkürler.
— LinearZoetrope

13
İnsanlar bunu Amerikan QWERTY klavyede nasıl yazarlar? Yoksa bu, gerektiği gibi simgeyi google'da aratabileceğiniz yaygın bir kullanım durumu değil mi?
— Seiyria

9
Bunun gibi . Emmeyen (yani Windows olmayan) işletim sistemleri, QWERTY düzeninin kullanılmayan katmanlarını eşler, böylece yorumlama gibi karakterler girilebilir.
— 2014

7
@FUZxxl FYI Alt-0183 (sayısal tuş takımını kullanarak) hala Windows için çalışıyor. Pek hoş değil ve genellikle dizüstü bilgisayarlarda zor, ama işe yarıyor.
— Intermernet

4
Linux'ta (en azından Ubuntu), oluşturma anahtarını etkinleştirdiyseniz: <compose> ^ .=·
— Izkata
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.