गो मेरी असेंबली को लिंक नहीं कर रहा है: अपरिभाषित बाहरी फ़ंक्शन


82

मैं ज्यादातर सीखने के उद्देश्य से कुछ SIMD लिखने की कोशिश कर रहा हूँ। मुझे पता है कि गो असेंबली को लिंक कर सकते हैं, लेकिन मैं इसे सही तरीके से काम करने के लिए नहीं कर सकता।

यहां सबसे न्यूनतम उदाहरण मैं बना सकता हूं (तत्व-वार वेक्टर गुणन):

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और मेरे जाओ संस्करण 1.3 किया जाना है। यह पुष्टि करने के लिए कि यह समस्या पैदा करने वाली वास्तुकला नहीं थी, मुझे एक और पैकेज मिला, जो असेंबली का उपयोग करता है और _amd64.sएक को छोड़कर सभी असेंबली फ़ाइलों को हटा दिया है और इसके परीक्षण ठीक चले।

मैंने इसे निर्यात पहचानकर्ता के मामले में बदलने की कोशिश की, जो अजीबता पैदा कर रहा था, लेकिन कोई पासा नहीं। मुझे लगता है कि मैंने पैकेज में टेम्पलेट का बहुत बारीकी से पालन किया है math/big, इसलिए उम्मीद है कि यह कुछ सरल और स्पष्ट है कि मैं गायब हूं।

मुझे पता है कि गो कम से कम असेंबली का उपयोग करने की कोशिश कर रहा है क्योंकि अगर मैं एक सिंटैक्स त्रुटि को पेश करता हूं। एस एस फाइल करें तो बिल्ड टूल इसके बारे में शिकायत करेगा।

संपादित करें:

स्पष्ट होने के लिए, go buildसफाई से संकलन करेंगे, लेकिन go testत्रुटि दिखाई देती है।


go buildसाफ-साफ समाप्त हो go testजाता है , विफल हो जाता है।
लिनियरजेट्रोपे

1
आप कैसे संकलन करते हैं? आपने सवाल का जवाब नहीं दिया।
fuz

1
आपके पास स्रोत फ़ाइलों के सापेक्ष किस निर्देशिका से आपने आदेश दर्ज किए हैं? मैं goनिर्माण उपकरण का उपयोग कर संकलन करता हूं । बहुत अस्पष्ट है। इसका कुछ भी मतलब हो सकता है।
फ़ूज

1
कॉलिंग go buildऔर go build foo.go, आदि के बीच अंतर है , यह भी संभव हो सकता है कि आपके पास फंकी सेटिंग्स हो $GOPATH, आदि। जितना अधिक आप लिखते हैं कि आपने वास्तव में क्या किया है, आपकी मदद करना उतना ही आसान है। सबसे अच्छी बात यह है कि पेशेवरों के बजाय शेल सत्रों के टेप पोस्ट करें।
फ़ूज

12
गो भाषा वास्तव में मिड-डॉट चरित्र के लिए एक बुत लगती है। संबंधित: समारोह के नाम और प्रोटोटाइप में स्लैश और डॉट्स?
कोड़ी ग्रे

जवाबों:


96

आप गलत डॉट का उपयोग कर रहे हैं। के बजाय

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

लिखो

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

और सब कुछ ठीक काम करता है।


11
खैर यह सूक्ष्म था, मैंने ध्यान नहीं दिया कि यह एक मध्य बिंदु था। धन्यवाद।
लिनियरजेट्रोपे

13
कैसे लोग टाइप करते हैं कि एक अमेरिकन QWERTY कीबोर्ड पर? या यह एक सामान्य उपयोग-मामला नहीं है, जहाँ आप आवश्यक रूप से प्रतीक को Google कर सकते हैं?
सेरिया

9
इस तरह । ओएस जो चूसना नहीं करते हैं (यानी विंडोज नहीं) QWERTY लेआउट की अप्रयुक्त परतों को मैप करते हैं ताकि इंटरपंच जैसे पात्रों को प्रवेश किया जा सके।
फ़ूज

7
@FUZxxl FYI Alt-0183 (नंबर-पैड का उपयोग करके) अभी भी विंडोज के लिए काम करता है। लैपटॉप पर बहुत अच्छा नहीं है, और आमतौर पर मुश्किल है, लेकिन यह काम करता है।
इंटरमरनेट

4
लिनक्स पर (उबंटू, कम से कम) यदि आपके पास <compose> ^ .·
कंपोज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.