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 GOHOSTARCHto be amd64와 my Go 버전을 1.3으로보고합니다. 문제를 일으키는 아키텍처가 아닌지 확인하기 위해 어셈블리를 사용하는 다른 패키지를 발견하고 _amd64.s하나를 제외한 모든 어셈블리 파일을 삭제 했으며 테스트가 정상적으로 실행되었습니다.

나는 또한 이상한 일을 일으키는 경우를 대비하여 내 보낸 식별자로 변경하려고 시도했지만 주사위는 없었습니다. 나는 같은 패키지의 템플릿을 꽤 밀접하게 따랐다 고 생각 math/big하므로 간단하고 분명한 것이 내가 놓친 것입니다.

.s 파일에 구문 오류를 도입하면 빌드 도구가 이에 대해 불평하기 때문에 Go가 적어도 어셈블리를 사용 하려고 한다는 것을 알고 있습니다.

편집하다:

명확 go build하게는 깔끔하게 컴파일되지만 go test오류가 나타납니다.


go build깔끔하게 완료되고 go test실패합니다.
LinearZoetrope 2014-08-23

1
어떻게 컴파일합니까? 당신은 질문에 대답하지 않았습니다.
fuz 2014-08-23

1
소스 파일과 관련된 디렉토리에서 어떤 명령을 입력 했습니까? 빌드 도구를 사용하여 컴파일합니다 go. 매우 모호합니다. 그것은 무엇이든 의미 할 수 있습니다.
fuz 2014-08-23

1
go buildgo build foo.go등의 호출에는 차이 가 있습니다. 등에서 펑키 한 설정이있을 수도 있습니다 $GOPATH. 정확히 수행 한 작업 에 대해 더 많이 쓸 수록 도움이 더 쉬워집니다. 가장 좋은 방법은 prosa 대신 셸 세션의 성적표를 게시하는 것입니다.
fuz 2014-08-23

12
Go 언어는 실제로 중간 점 캐릭터에 대한 페티쉬를 가지고있는 것 같습니다. 관련 : 함수 이름과 프로토 타입의 슬래시와 점?
Cody Gray

답변:


96

잘못된 점을 사용하고 있습니다. 대신에

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

쓰다

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

모든 것이 잘 작동합니다.


11
글쎄, 그것은 미묘했다. 나는 그것이 중간 점이라는 것을 알지 못했다. 감사.
LinearZoetrope 2014 년

13
사람들은 미국 QWERTY 키보드에서 어떻게 입력합니까? 아니면 필요에 따라 기호를 검색 할 수있는 일반적인 사용 사례가 아닌가?
Seiyria 2014-08-23

9
이렇게 . 짜증나 지 않는 (즉, Windows가 아닌) OS는 QWERTY 레이아웃의 사용하지 않는 레이어를 매핑하여 interpunct와 같은 문자를 입력 할 수 있습니다.
fuz 2014-08-23

7
@FUZxxl FYI Alt-0183 (숫자 패드 사용)은 Windows에서 계속 작동합니다. 랩톱에서는 그다지 좋지 않고 일반적으로 어렵지만 작동합니다.
Intermernet 2014-08-24

4
Linux (최소한 우분투)에서 compose 키를 활성화 한 경우 : <compose> ^ .=·
Izkata
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.