Go: cmd/compile: Nexus 9 linux/arm64μ—μ„œ ν…ŒμŠ€νŠΈ/λΉ λ₯Έ μ˜€μž‘λ™

에 λ§Œλ“  2017λ…„ 03μ›” 31일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: golang/go

testing/quick의 int64 μ„ νƒκΈ°λŠ” [-2⁢²,2⁢²) λ²”μœ„μ˜ 값을 λ°˜ν™˜ν•˜λ„λ‘ μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
그건 μ‹€μˆ˜μ•Ό. #19808을 μˆ˜μ •ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ μ½”λ“œλŠ” μž‘μ„±λœ λŒ€λ‘œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜μ§€λ§Œ @dr2chase 의 Nexus 9μ—μ„œλŠ”
android/arm64 νˆ΄μ²΄μΈμ—μ„œ λΉŒλ“œλœ linux/arm64 툴체인 μ‹€ν–‰
λ‹€λ₯Έ κ³³μ—μ„œ ꡐ차 μ»΄νŒŒμΌλ˜μ–΄ κ²½ν—˜μ μœΌλ‘œ μ™ΈλΆ€ 값을 μƒμ„±ν•©λ‹ˆλ‹€.
κ·Έ λ²”μœ„. (#19807을 μ°ΎλŠ” 데 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.)

linux/arm64 도ꡬ μ²΄μΈμ—μ„œ λΉŒλ“œλœ linux/arm64 도ꡬ 체인 μ‚¬μš©
Odroid의 λ‹€λ₯Έ κ³³μ—μ„œ 크둜슀 μ»΄νŒŒμΌν•˜λ©΄ μ˜¬λ°”λ₯΄κ²Œ μž‘λ™ν•©λ‹ˆλ‹€.

전체 λ²”μœ„λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ ν…ŒμŠ€νŠΈ/λΉ λ₯Έ μˆ˜μ • 전에
ν˜„μž¬ μ½”λ“œκ°€ 더 쒁은 λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λŠ” 값을 μƒμ„±ν•˜λŠ” 이유
이 κ΅¬μ„±μ—μ„œ.

μˆ˜ν•™/λžœλ“œμ˜ (*Rand).Int63 λ§ν•œλ‹€:

return r.src.Int63()

및 (* rngSource).Int63은 λ‹€μŒκ³Ό 같이 λ§ν•©λ‹ˆλ‹€.

return int64(rng.Uint64() & _MASK)

μ–΄λ””:

const (
    _MAX  = 1 << 63
    _MASK = _MAX - 1
)

그런 λ‹€μŒ testing/quick의 randInt64 ν•¨μˆ˜λŠ” λ‹€μŒμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

return rand.Int63() - 1<<62

λ”°λΌμ„œ & _MASK λ˜λŠ” - 1<<62 κ°€ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

Nexus 9 ARM64 ν•˜λ“œμ›¨μ–΄μ— 버그가 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
android/arm64 툴체인이 λ‹€μŒ μš©λ„λ‘œ μ‚¬μš© 쀑일 수 μžˆμŠ΅λ‹ˆλ‹€.
Nexus 9의 λΆ€νŠΈμŠ€νŠΈλž©μ€ 버그가 μžˆμ–΄ 기본적으둜 μ»΄νŒŒμΌλ©λ‹ˆλ‹€.
linux/arm64 툴체인이 버그가 μžˆμ–΄ ν…ŒμŠ€νŠΈ/λΉ λ₯Έ
μ˜ˆμƒμΉ˜ λͺ»ν•œ 값을 μƒμ„±ν•˜λŠ” μ½”λ“œ. μš°λ¦¬λŠ” λͺ¨λ₯Έλ‹€.

FrozenDueToAge

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ‹€μŒ C ν”„λ‘œκ·Έλž¨μ€ λ¬Έμ œκ°€ μžˆλŠ” μ‹œμŠ€ν…œμ—μ„œ μ˜€μž‘λ™ν•©λ‹ˆλ‹€.

#include <stdio.h>

typedef unsigned long long uvlong;

uvlong f() { return ~0ull; }
uvlong g() { return (f() << 1) >> 1; }

int main() {
    for (int i = 0;; i++) {
        if ((long long)g() < 0) {
            printf("%d\n", i);
        }
    }
    return 0;
}

20k-50k 반볡 후에 λ£¨ν”„λŠ” λͺ¨λ“  λ°˜λ³΅μ—μ„œ iλ₯Ό μΈμ‡„ν•˜κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€.

고의 잘λͺ»μ΄ μ•„λ‹ˆλ‹€. λ‹€λ₯Έ κ³³μ—μ„œ λ³΄κ³ ν•˜λŠ” 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  3 λŒ“κΈ€

CL https://golang.org/cl/39152 에 이 λ¬Έμ œκ°€ μ–ΈκΈ‰λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ C ν”„λ‘œκ·Έλž¨μ€ λ¬Έμ œκ°€ μžˆλŠ” μ‹œμŠ€ν…œμ—μ„œ μ˜€μž‘λ™ν•©λ‹ˆλ‹€.

#include <stdio.h>

typedef unsigned long long uvlong;

uvlong f() { return ~0ull; }
uvlong g() { return (f() << 1) >> 1; }

int main() {
    for (int i = 0;; i++) {
        if ((long long)g() < 0) {
            printf("%d\n", i);
        }
    }
    return 0;
}

20k-50k 반볡 후에 λ£¨ν”„λŠ” λͺ¨λ“  λ°˜λ³΅μ—μ„œ iλ₯Ό μΈμ‡„ν•˜κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€.

고의 잘λͺ»μ΄ μ•„λ‹ˆλ‹€. λ‹€λ₯Έ κ³³μ—μ„œ λ³΄κ³ ν•˜λŠ” 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

CL https://golang.org/cl/39310 에 이 λ¬Έμ œκ°€ μ–ΈκΈ‰λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰