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.