Slide 1

Slide 1 text

࢛ଇԋࢉΛཧղ͢Δ 2022/5/17 Ԭຊᕣฏ Twitter:@okaponta_

Slide 2

Slide 2 text

ࣗݾ঺հɿԬຊ ᕣฏ • େֶ͸Խֶͷݚڀ • ৽ଔ͸ۚ༥ܥͷSIer (γϯϓϨΫε) • 2021/7ʙ ϦΫϧʔτͰΤϯδχΞͯ͠·͢ • झຯɿԻήʔɺڝϓϩɺΫιΞϓϦ࡞੒ • Twitter: @okaponta_ • GitHub: @okaponta

Slide 3

Slide 3 text

ͬͦ͘͞Ͱ͕͢

Slide 4

Slide 4 text

ྼ౳ײͰམͪࠐΜͩ͜ͱ ͋Γ·ͤΜ͔ʁ

Slide 5

Slide 5 text

جૅΛษڧ͠Α͏ͱࢥ͍

Slide 6

Slide 6 text

Ҏલɺ࢛ଇԋࢉʹ͍ͭͯௐ΂·ͨ͠

Slide 7

Slide 7 text

ͷલʹɾɾɾ

Slide 8

Slide 8 text

2ਐ๏ͱ࿦ཧԋࢉʹ͍ͭͯ(͔͚͋͠) • σδλϧίϯϐϡʔλͰ͸ిѹͷߴ௿ʹΑΓ৘ใΛදݱ͍ͯ͠Δ • ෺ཧతʹݕग़͠΍͍͔͢Β(ిѹͷࡉ͔͍ௐ੔͕೉͍͠) • ిѹͷߴ͍ঢ়ଶΛʮ1ʯɺ௿͍ঢ়ଶΛʮ0ʯͱͯ͠2ਐ๏Ͱදݱ • ࠓ͸τϥϯδελ্͕هͷεΠονϯάͷ໾ׂΛ୲͍ͬͯΔ

Slide 9

Slide 9 text

2ਐ๏ͱ࿦ཧԋࢉʹ͍ͭͯ(͔͚͋͠) https://akizukidenshi.com/catalog/g/gI-13829/ https://sagara-works.jp/research-and-development/electronics/transistor-basic/transistor-switch/

Slide 10

Slide 10 text

2ਐ๏ͱ࿦ཧԋࢉʹ͍ͭͯ(͔͚͋͠) • τϥϯδελΛ૊Έ߹ΘͤΔ͜ͱͰɾɾɾ • ిѹͷߴ௿Λٯʹ͢Δճ࿏Λ࡞੒Ͱ͖Δ • NOTԋࢉ • 2ͭͷిѹΛΠϯϓοτ͔ΒɺిѹΛग़ྗ͢Δճ࿏Λ࡞੒Ͱ͖Δ • NAND/OR/AND/XORԋࢉ

Slide 11

Slide 11 text

ORճ࿏ https://sagara-works.jp/research-and-development/logic

Slide 12

Slide 12 text

Ճ๏ • ͖͞΄Ͳͷ࿦ཧԋࢉͷ૊Έ߹ΘͤͰදݱͰ͖Δɻ • (1ͷҐ) A XOR B • (2ͷҐ) A AND B • ൒Ճࢉث͍ͬͯ͏Β͍͠ɻ

Slide 13

Slide 13 text

Ճ๏ • ͖͞΄Ͳͷ࿦ཧԋࢉͷ૊Έ߹ΘͤͰදݱͰ͖Δɻ • (1ͷҐ) A XOR B • (2ͷҐ) A AND B • ൒Ճࢉث͍ͬͯ͏Β͍͠ɻ • https://nandgame.com/

Slide 14

Slide 14 text

Ճ๏ • ܁Γ্͕Γʹ΋ରԠͨ͠΋ͷΛશՃࢉثͱ͍͏ • (1ͷҐ) (A XOR B) XOR C • (2ͷҐ) (A AND B) OR ((A XOR B) AND C)

Slide 15

Slide 15 text

Ճ๏ • ܁Γ্͕Γʹ΋ରԠͨ͠΋ͷΛશՃࢉثͱ͍͏ • (1ͷҐ) (A XOR B) XOR C • (2ͷҐ) (A AND B) OR ((A XOR B) AND C) • ͪͳΈʹɺNANDͷΈͰશͯͷ࿦ཧճ࿏Λද ݱͰ͖ΔΒ͍͠Ͱ͢ɻ

Slide 16

Slide 16 text

Ճ๏ • ܁Γ্͕Γʹ΋ରԠͨ͠΋ͷΛશՃࢉثͱ͍͏ • (1ͷҐ) (A XOR B) XOR C • (2ͷҐ) (A AND B) OR ((A XOR B) AND C) • ͪͳΈʹɺNANDͷΈͰશͯͷ࿦ཧճ࿏Λද ݱͰ͖ΔΒ͍͠Ͱ͢ɻ

Slide 17

Slide 17 text

ݮ๏ • ଍͠ࢉͱಉ͡Ͱ͢ʂ • ಺෦తʹෛͷ਺Λิ਺ͱ͍͏ঢ়ଶͰ؅ཧ͢Δ

Slide 18

Slide 18 text

ݮ๏ • ଍͠ࢉͱಉ͡Ͱ͢ʂ • ಺෦తʹෛͷ਺Λิ਺ͱ͍͏ঢ়ଶͰ؅ཧ͢Δ • ྫ) 5-3 • 00000101 + 11111101 • 1)00000010

Slide 19

Slide 19 text

ݮ๏ • ଍͠ࢉͱಉ͡Ͱ͢ʂ • ಺෦తʹෛͷ਺Λิ਺ͱ͍͏ঢ়ଶͰ؅ཧ͢Δ • ྫ) 5-3 • 00000101 + 11111101 • 1)00000010 ิ਺ Φʔόʔϑϩʔ͢Δ

Slide 20

Slide 20 text

৐๏ • γϑτԋࢉͱ଍͠ࢉΛ૊Έ߹Θͤͯ଍͠ࢉΛߦ͍·͢ɻʢΒ͍͠ʣ • චࢉͱಉ͡Ͱ͢ɻ

Slide 21

Slide 21 text

ྫ) 5 × 13 0110×1101

Slide 22

Slide 22 text

ྫ) 5 × 13 0110×1101 0000110 1

Slide 23

Slide 23 text

ྫ) 5 × 13 0110×1101 0000110 1 0000000 0

Slide 24

Slide 24 text

ྫ) 5 × 13 0110×1101 0000110 1 0000000 0 0011000 1

Slide 25

Slide 25 text

ྫ) 5 × 13 0110×1101 0000110 1 0000000 0 0011000 1 0110000 1

Slide 26

Slide 26 text

ྫ) 5 × 13 0110×1101 0000110 1 0000000 0 0011000 1 0110000 1 1001110 (65)

Slide 27

Slide 27 text

γϑτԋࢉͯ͠Δ࣮ͬͯײ͍ͨ͠ package mai n func mul(x, y int) int { return x * y } func main() { mul(5, 13 ) } > go tool compile -S mul.g o 0x0000 00000 (mul.go:4) MOVD "".x(FP), R 0 0x0004 00004 (mul.go:4) MOVD "".y+8(FP), R 1 0x0008 00008 (mul.go:4) MUL R1, R0, R 0 0x000c 00012 (mul.go:4) MOVD R0, "".~r2+16(FP ) 0x0010 00016 (mul.go:4) RET (R30) ΞηϯϒϥϨϕϧͰ .6-໋ྩ͕͋Δ

Slide 28

Slide 28 text

γϑτԋࢉͯ͠Δ࣮ͬͯײ͍ͨ͠(ͺʔͱ2 func Benchmark_mul_2exp(b *testing.B) { var base int64 = get2exp() // 2^30 or 2^3 1 var hoge int64 = get2exp() - 1 b.ResetTimer( ) for i := 0; i < b.N; i++ { for j := 0; j < 10000; j++ { hoge = mul64(hoge, base ) } } if hoge == 1 { b.Fail( ) } } ͜͜ΛCBTFIPHFΛ͍Ζ͍Ζ ม࣮͑ͯݧͯ͠ΈΔ

Slide 29

Slide 29 text

γϑτԋࢉͯ͠Δ࣮ͬͯײ͍ͨ͠(ͺʔͱ2 > go test -bench . -benchme m goos: darwi n goarch: arm6 4 pkg: mu l Benchmark_mul_2exp-8 123480 9659 ns/op 0 B/op 0 allocs/o p Benchmark_mul_2exp_minus1-8 123620 9651 ns/op 0 B/op 0 allocs/o p Benchmark_mul_2exp_plus1-8 123568 9647 ns/op 0 B/op 0 allocs/o p Benchmark_plus_2exp-8 365474 3226 ns/op 0 B/op 0 allocs/o p PAS S ok mul 5.341s

Slide 30

Slide 30 text

৐๏ • (ࠩΛग़ͦ͏ͱΊͬͪΌؤு͚ͬͨͲ)ͼͬ͘Γ͢Δ΄ͲมԽ͕ͳ͔ͬͨ • 2ͷྦྷ৐ϚΠφε1͕ۃ୺ʹ஗͘ͳΔͷΛظ଴͕ͨ͠ɺಉ͡ΫϩοΫ਺Ͱ ܭࢉͰ͖ΔΑ͏ʹͳͬͯΔΈ͍ͨɻ • ଍͠ࢉͷ3ഒͷ࣌ؒͰֻ͚ࢉ͸ܭࢉͰ͖Δ • ࣗ෼ͷCPU3.2GHzΈ͍ͨͳͷͰɺ1ΫϩοΫ໿0.31nsͰɺॲཧ͕ͦͷ ഒ਺ʹͳͬͯΔͷ͸໘ന͍ɻ3ΫϩοΫͰֻ͚ࢉ͕ܭࢉͰ͖ͯ·͢Ͷɻ

Slide 31

Slide 31 text

আ๏ • ஗͍ͱઐΒධ൑ • SRT๏ • ϧοΫΞοϓςʔϒϧΛ༻͍ͯෳ਺ͷܻΛ·ͱΊׂͯΓࢉ • 2ܻͣͭॲཧ͢Δͷ͕Radix-4 Divider • 4ܻͣͭॲཧ͢Δͷ͕Radix-16 Divider • ଞʹ΋χϡʔτϯ๏Λ࢖͏ํ๏΍ɺΰʔϧυγϡϛοτ๏ͳΔ΋ͷ͕͋ΔΒ ͍͠

Slide 32

Slide 32 text

আࢉ func Benchmark_div_2exp(b *testing.B) { var base int = getSmall2exp() // 2^5 or 2^ 6 var hoge int = get2exp() - 1 b.ResetTimer( ) for i := 0; i < b.N; i++ { for j := 0; j < 10000; j++ { hoge = div(hoge, base ) } } if hoge == 1 { b.Fail( ) } } ͜͜ΛมԽͤͯ͞ΈΔ

Slide 33

Slide 33 text

আࢉ > go test -bench . -benchmem goos: darwi n goarch: arm6 4 pkg: di v Benchmark_div_2exp-8 51686 22046 ns/op 0 B/op 0 allocs/o p Benchmark_div_2exp_minus1-8 53272 21935 ns/op 0 B/op 0 allocs/o p Benchmark_div_2exp_plus1-8 54561 21931 ns/op 0 B/op 0 allocs/o p Benchmark_plus_2exp-8 372552 3140 ns/op 0 B/op 0 allocs/o p PAS S ok div 5.487s

Slide 34

Slide 34 text

আࢉʢఆ਺ʣ func div2(x uint) uint { return x / 2 } func div3(x uint16) uint16 { return x / 3 } > go tool compile -S ./div-const.g o 0x0000 00000 (./div-const.go:4) MOVD "".x(FP), R 0 0x0004 00004 (./div-const.go:4) LSR $1, R0, R 0 0x0008 00008 (./div-const.go:4) MOVD R0, "".~r1+8(FP ) 0x000c 00012 (./div-const.go:4) RET (R30)

Slide 35

Slide 35 text

আࢉʢఆ਺ʣ func div2(x uint) uint { return x / 2 } func div3(x uint16) uint16 { return x / 3 } > go tool compile -S ./div-const.g o 0x0000 00000 (./div-const.go:4) MOVD "".x(FP), R 0 0x0004 00004 (./div-const.go:4) LSR $1, R0, R 0 0x0008 00008 (./div-const.go:4) MOVD R0, "".~r1+8(FP ) 0x000c 00012 (./div-const.go:4) RET (R30) ࠨγϑτԋࢉ

Slide 36

Slide 36 text

আࢉʢఆ਺ʣ func div2(x uint) uint { return x / 2 } func div3(x uint16) uint16 { return x / 3 } > go tool compile -S ./div-const.g o 0x0000 00000 (./div-const.go:8) MOVHU "".x(FP), R 0 0x0004 00004 (./div-const.go:8) MOVD $87382, R 1 0x000c 00012 (./div-const.go:8) MUL R0, R1, R 0 0x0010 00016 (./div-const.go:8) LSR $18, R0, R 0 0x0014 00020 (./div-const.go:8) MOVH R0, "".~r1+8(FP ) 0x0018 00024 (./div-const.go:8) RET (R30) ͱͷ ֻ͚ࢉʹม׵

Slide 37

Slide 37 text

আࢉʢఆ਺ʣ func div2(x uint) uint { return x / 2 } func div3(x uint16) uint16 { return x / 3 } > go tool compile -S ./div-const.g o 0x0000 00000 (./div-const.go:8) MOVHU "".x(FP), R 0 0x0004 00004 (./div-const.go:8) MOVD $87382, R 1 0x000c 00012 (./div-const.go:8) MUL R0, R1, R 0 0x0010 00016 (./div-const.go:8) LSR $18, R0, R 0 0x0014 00020 (./div-const.go:8) MOVH R0, "".~r1+8(FP ) 0x0018 00024 (./div-const.go:8) RET (R30) x 3 = x × 1 3 = x × 218 3 × 1 218 ≃ x × 218 + 2 3 × 1 218 

Slide 38

Slide 38 text

আࢉ • ༧Ίγϑτԋࢉͱೝࣝ͠ͳ͍ݶΓ͸ී௨ʹׂΓࢉ͢Δ • ࢼͨ͠ྫͩͱ͍͍ͩͨ7ΫϩοΫ͘Β͍ • தͰͲΜͳॲཧ͕ߦΘΕ͍ͯΔͷ͔͸෼͔Βͳ͔͕ͬͨɺ64bitͷ ׂΓࢉʹͯ͠΋7ΫϩοΫͰॲཧΛߦ͍͑ͯͨɻ • ఆ਺ͷ৔߹͸ίϯύΠϧ࣌ʹ͍͍ײ͡ʹม׵ͯ͘͠ΕΔ

Slide 39

Slide 39 text

ײ૝ • جૅͱࢥ࢛ͬͯଇԋࢉΛௐ΂ͯΈ͚ͨͲԞ͕ਂ͗ͨ͢ɾɾɾ • ݁ہ࢛ଇԋࢉ΋׬શʹཧղͰ͖ͳ͍ • ઌਓɺҒେ͗ͯ͢ײ৺ͪ͠Ό͏ • ͸΍ͪ͘Ͱ͝ΊΜͳ͍͞ʂʂʂ