Slide 1

Slide 1 text

LOUL 4XJGUͷ4*.%ͱͦͷར༻ํ๏ J04%$JPTEDE

Slide 2

Slide 2 text

wLOULʢΧωλΧʣ wגࣜձࣾϝϧΧϦ ࣗݾ঺հ

Slide 3

Slide 3 text

͸͡Ίʹ w4*.%໋ྩ w$16ʹଘࡏ͢Δߴ଎ԋࢉػೳ wը૾ɾԻ੠ॲཧ

Slide 4

Slide 4 text

w0QFO$7 OVNQZ w"DDFMFSBUF'SBNFXPSL wW*NBHF W%41 wʮ$16্Ͱߴ଎ͳॲཧʯ͸େମ4*.% ͸͡Ίʹ

Slide 5

Slide 5 text

w4XJGUʹ΋ଘࡏ w3FBMJUZ,JUͰ࢖͏ wߴ଎ʹԋࢉ͕Ͱ͖Δݻఆ௕഑ྻ ͸͡Ίʹ let a = SIMD4(1.0, 2.0, 3.0, 4.0) let b = SIMD4(5.0, 6.0, 7.0, 8.0) let add = a * b // 6.0, 8.0, 10.0, 12.0

Slide 6

Slide 6 text

໨࣍ w4*.%ͱ͸ w4XJGUͷ4*.% wϢʔεέʔε wܕͱؔ܎ w໰୊఺

Slide 7

Slide 7 text

4*.%ͱ͸

Slide 8

Slide 8 text

4*.%ʢγϜσΟʔʣͱ͸ w4JOHMF*OTUSVDUJPO.VMUJQMF%BUB wҰͭͷ໋ྩͰෳ਺ͷσʔλΛॲཧ͢Δ w֓೦ɾQSPUPDPM

Slide 9

Slide 9 text

4*.%ʢγϜσΟʔʣͱ͸ w4JOHMF*OTUSVDUJPO.VMUJQMF%BUB wҰͭͷ໋ྩͰෳ਺ͷσʔλΛॲཧ͢Δ w֓೦ɾQSPUPDPM w$16ͷ4*.%໋ྩ (16

Slide 10

Slide 10 text

4*.%ʢγϜσΟʔʣͱ͸ w4JOHMF*OTUSVDUJPO.VMUJQMF%BUB wҰͭͷ໋ྩͰෳ਺ͷσʔλΛॲཧ͢Δ w֓೦ɾQSPUPDPM w$16ͷ4*.%໋ྩ (16

Slide 11

Slide 11 text

$16 εΧϥԋࢉ໋ྩ wεΧϥԋࢉ໋ྩʢ௨ৗͷԋࢉ໋ྩʣ w࠷େCJUͷσʔλؒͰԋࢉ wCJUͷϨδελ

Slide 12

Slide 12 text

$16 εΧϥԋࢉͷΠϝʔδ

Slide 13

Slide 13 text

$16 εΧϥԋࢉͷΠϝʔδ

Slide 14

Slide 14 text

$16 εΧϥԋࢉͷΠϝʔδ

Slide 15

Slide 15 text

$16 εΧϥԋࢉͷΠϝʔδ

Slide 16

Slide 16 text

$16 εΧϥԋࢉͷΠϝʔδ

Slide 17

Slide 17 text

$16 εΧϥԋࢉͷΠϝʔδ

Slide 18

Slide 18 text

$16 εΧϥԋࢉͷΠϝʔδ

Slide 19

Slide 19 text

$16 εΧϥԋࢉͷΠϝʔδ

Slide 20

Slide 20 text

$16 εΧϥԋࢉͷΠϝʔδ

Slide 21

Slide 21 text

$16 4*.%ԋࢉ w4*.%ԋࢉ໋ྩʢϕΫτϧԋࢉ໋ྩʣ wCJUҎ্ͷσʔλؒͰԋࢉ wCJUҎ্ͷϨδελͱઐ༻ճ࿏

Slide 22

Slide 22 text

$16 4*.%ԋࢉ w4*.%ԋࢉ໋ྩʢϕΫτϧԋࢉ໋ྩʣ wCJUҎ্ͷσʔλؒͰԋࢉ wCJUҎ্ͷϨδελͱઐ༻ճ࿏ wϨδελʹෳ਺ͷ஋Λ٧Ίͯԋࢉ

Slide 23

Slide 23 text

$16 4*.%ԋࢉͷΠϝʔδ Y@ "79

Slide 24

Slide 24 text

$16 4*.%ԋࢉͷΠϝʔδ Y@ "79

Slide 25

Slide 25 text

$16 4*.%ԋࢉͷΠϝʔδ Y@ "79

Slide 26

Slide 26 text

$16 4*.%ԋࢉͷΠϝʔδ Y@ "79

Slide 27

Slide 27 text

$16 4*.%ԋࢉͷΠϝʔδ Y@ "79

Slide 28

Slide 28 text

$16 4*.%ԋࢉͷΠϝʔδ Y@ "79

Slide 29

Slide 29 text

$16 4*.%ԋࢉͷ࠷େϏοτ௕ w44& Y@ CJU w"79 Y@ CJU w"79 Y@ CJU w/&0/ "3. CJU

Slide 30

Slide 30 text

4XJGUͷ4*.%

Slide 31

Slide 31 text

4XJGUͷ4*.% w4XJGUʙ wඪ४ϥΠϒϥϦ

Slide 32

Slide 32 text

4XJGUͷ4*.%Ϣʔεέʔε

Slide 33

Slide 33 text

4XJGUͷ4*.% wύϑΥʔϚϯε͕ඞཁʹͳΔॲཧ wը૾ɾԻ੠ॲཧ Ϣʔεέʔε4*.%ϓϩάϥϛϯά

Slide 34

Slide 34 text

4XJGUͷ4*.% Ϣʔεέʔε4*.%ϓϩάϥϛϯάʢը૾ͷϘοΫεϑΟϧλʣ let input: [[UInt8]] = … var output: [[UInt8]] = … for j in 0..

Slide 35

Slide 35 text

4XJGUͷ4*.% Ϣʔεέʔε4*.%ϓϩάϥϛϯάʢը૾ͷϘοΫεϑΟϧλʣ let input: [[UInt8]] = … var output: [[UInt8]] = … for j in 0..

Slide 36

Slide 36 text

4XJGUͷ4*.% Ϣʔεέʔε4*.%ϓϩάϥϛϯάʢը૾ͷϘοΫεϑΟϧλʣ for y in 0...zero for k in 0..(yresult[startIndex..

Slide 37

Slide 37 text

4XJGUͷ4*.% Ϣʔεέʔε4*.%ϓϩάϥϛϯάʢը૾ͷϘοΫεϑΟϧλʣ IUUQTHJUIVCDPNLOULZNUTXJGUJNBHFQSPDFTTJOHTBNQMF IUUQTTQFBLFSEFDLDPNLOULZNUNFFUIJHIQFSGPSNBODFJNBHF fi MUFSJOHJOTXJGU

Slide 38

Slide 38 text

4XJGUͷ4*.% w࠲ඪදݱʢओʹ"3 73 $(ͳͲʣ w%΍%ͷ࠲ඪදݱ͕Ͱ͖Δσʔλߏ଄ wࠓ·Ͱ4XJGUඪ४Ͱଘࡏ͠ͳ͔ͬͨ Ϣʔεέʔε࠲ඪදݱ let point = SIMD2(x: 1.0, y: 2.0) let position = SIMD3(x: 1.0, y: 2.0, z: 3.0)

Slide 39

Slide 39 text

4XJGUͷ4*.% w3FBMJUZ,JU)BT5SBOTGPSN w4DFOF,JU4$//PEF Ϣʔεέʔε࠲ඪදݱ import RealityKit let modelEntity = ModelEntity() modelEntity.position = SIMD3(0, 1, 2)

Slide 40

Slide 40 text

4XJGUͷ4*.% wཁૉຖͷԋࢉΛαϙʔτ Ϣʔεέʔε࠲ඪදݱ let a = SIMD2(x: 1.0, y: 2.0) let b = SIMD2(x: 1.0, y: 3.0) a + b // (2.0, 5.0) ཁૉຖͷ࿨ a .== b // (true, false) ཁૉຖͷҰக pointwiseMax(a, b) // (1.0, 3.0) ཁૉຖͷmax

Slide 41

Slide 41 text

4XJGUͷ4*.%ܕͱؔ܎

Slide 42

Slide 42 text

4XJGUͷ4*.% wTUSVDU4*.%O4DBMBS4*.%4DBMBS4*.% wTUSVDU4*.%.BTL4UPSBHF4*.%4*.% ܕͱؔ܎

Slide 43

Slide 43 text

4XJGUͷ4*.% wTUSVDU4*.%O4DBMBS4*.%4DBMBS4*.% wTUSVDU4*.%.BTL4UPSBHF4*.%4*.% ܕͱؔ܎

Slide 44

Slide 44 text

4XJGUͷ4*.% wTUSVDU4*.%O4DBMBS4*.%4DBMBS4*.% wTUSVDU4*.%.BTL4UPSBHF4*.%4*.% wQSPUPDPM4*.%4*.%4UPSBHF ܕͱؔ܎

Slide 45

Slide 45 text

4XJGUͷ4*.% wTUSVDU4*.%O4DBMBS4*.%4DBMBS4*.% wTUSVDU4*.%.BTL4UPSBHF4*.%4*.% ܕͱؔ܎

Slide 46

Slide 46 text

4XJGUͷ4*.% wԋࢉ͕Ͱ͖Δ let a = SIMD4(1.0, 2.0, 3.0, 4.0) let b = SIMD4(1.0, 2.0, 3.0, 4.0) a + b // SIMD4(2.0, 4.0, 6.0, 8.0) a - b // SIMD4(0.0, 0.0, 0.0, 0.0) a * b // SIMD4(1.0, 4.0, 9.0, 16.0) a / b // SIMD4(1.0, 1.0, 1.0, 1.0) ࢖༻ྫ4*.%O

Slide 47

Slide 47 text

4XJGUͷ4*.% wTUSVDU4*.%O4DBMBS4*.%4DBMBS4*.% ܕͱؔ܎TUSVDU4*.%O

Slide 48

Slide 48 text

4XJGUͷ4*.% wTUSVDU4*.%O4DBMBS4*.%4DBMBS4*.% wOཁૉ਺ let a = SIMD2(1.0, 2.0) let b = SIMD3(1.0, 2.0, 3.0) let c = SIMD4(1.0, 2.0, 3.0, 4.0) ܕͱؔ܎TUSVDU4*.%O

Slide 49

Slide 49 text

4XJGUͷ4*.% wTUSVDU4*.%O4DBMBS4*.%4DBMBS4*.% wOཁૉ਺ public struct SIMD2: SIMD public struct SIMD3: SIMD public struct SIMD4: SIMD ... ܕͱؔ܎TUSVDU4*.%O

Slide 50

Slide 50 text

4XJGUͷ4*.% wTUSVDU4*.%O4DBMBS4*.%4DBMBS4*.% wOཁૉ਺ w4DBMBSཁૉͷܕ let a = SIMD2(1.0, 2.0) let b = SIMD2(1.0, 2.0) let c = SIMD4(1, 2, 3, 4) let d = SIMD4(1, 2, 3, 4) ܕͱؔ܎TUSVDU4*.%O

Slide 51

Slide 51 text

4XJGUͷ4*.% // ϥϕϧ͋Γ (SIMD2,3,4ͷΈ) SIMD3(x: 1.0, y: 2.0, z: 3.0) // ϥϕϧͳ͠ SIMD3(1.0, 2.0, 3.0) // arrayLiteral let a: SIMD3 = [1, 2, 3] // Sequence SIMD3([1,2,3]) let array = [1,2,3,4,5,6] SIMD3(array[1..<4]) SIMD3(array.suffix(3)) ࢖༻ྫ4*.%Oͷੜ੒

Slide 52

Slide 52 text

4XJGUͷ4*.% // ֦ு let xy = SIMD2(10, 20) let xyz = SIMD3(xy, 30) // SIMD3(10, 20, 30) ࢖༻ྫ4*.%Oͷੜ੒

Slide 53

Slide 53 text

4XJGUͷ4*.% // ֦ு let xy = SIMD2(10, 20) let xyz = SIMD3(xy, 30) // SIMD3(10, 20, 30) // γϟοϑϧ let yxz = xyz[.init(1, 0, 2)] // SIMD3(20, 10, 30) ࢖༻ྫ4*.%Oͷੜ੒

Slide 54

Slide 54 text

4XJGUͷ4*.% // ֦ு let xy = SIMD2(10, 20) let xyz = SIMD3(xy, 30) // SIMD3(10, 20, 30) // γϟοϑϧ let yxz = xyz[.init(1, 0, 2)] // SIMD3(20, 10, 30) // ෦෼நग़ let xy = xyz[.init(0, 1)] // SIMD2(10, 20) ࢖༻ྫ4*.%Oͷੜ੒

Slide 55

Slide 55 text

4XJGUͷ4*.% wTUSVDU4*.%O4DBMBS4*.%4DBMBS4*.% wTUSVDU4*.%.BTL4UPSBHF4*.%4*.% ܕͱؔ܎

Slide 56

Slide 56 text

4XJGUͷ4*.% wQSPUPDPM4*.%4DBMBS w4*.%Oͷཁૉͱͯ͠࢖͑Δܕ ܕͱؔ܎QSPUPDPM4*.%4DBMBS

Slide 57

Slide 57 text

4XJGUͷ4*.% wQSPUPDPM4*.%4DBMBS w4*.%Oͷཁૉͱͯ͠࢖͑Δܕ ܕͱؔ܎QSPUPDPM4*.%4DBMBS Double Float Float16 Int Int8 Int16 Int32 Int64 UInt UInt8 UInt16 UInt32 UInt64

Slide 58

Slide 58 text

4XJGUͷ4*.% wQSPUPDPM4*.%4DBMBS w'MPBUJOH1PJOU w'JYFE8JEUI*OUFHFS ܕͱؔ܎QSPUPDPM4*.%4DBMBS Int Int8 Int16 Int32 Int64 UInt UInt8 UInt16 UInt32 UInt64 Double Float Float16

Slide 59

Slide 59 text

4XJGUͷ4*.% w'JYFE8JEUI*OUFHFS޲͚ૢ࡞ let a = SIMD3(x: 1, y: 2, z: 3) let b = SIMD3(x: 1, y: 1, z: 1) ~a // SIMD3(254, 253, 252) a & b // SIMD3(1, 0, 1) ܕͱؔ܎QSPUPDPM4*.%4DBMBS

Slide 60

Slide 60 text

4XJGUͷ4*.% w'JYFE8JEUI*OUFHFS޲͚ૢ࡞ w'MPBUJOH1PJOU޲͚ૢ࡞ let a = SIMD3(x: 2.0, y: 3.0, z: 4.0) a.squareRoot() // SIMD3(1.4142135, 1.7320508, 2.0) let a = SIMD3(x: 1.0, y: 1.4, z: 1.8) a.rounded(.up) // SIMD3(1.0, 2.0, 2.0) let a = SIMD3(x: 1, y: 2, z: 3) let b = SIMD3(x: 1, y: 1, z: 1) ~a // SIMD3(254, 253, 252) a & b // SIMD3(1, 0, 1) ܕͱؔ܎QSPUPDPM4*.%4DBMBS

Slide 61

Slide 61 text

4XJGUͷ4*.% wTUSVDU4*.%O4DBMBS4*.%4DBMBS4*.% wTUSVDU4*.%.BTL4UPSBHF4*.%4*.% ܕͱؔ܎

Slide 62

Slide 62 text

4XJGUͷ4*.% wQSPUPDPM4*.% w4*.%OΛந৅Խ wWBSTDBMBS$PVOU*OU wGVODTVCTDSJQU JOEFY*OU ܕͱؔ܎QSPUPDPM4*.%

Slide 63

Slide 63 text

wશͯͷ4*.%OͰ࢖͑Δؔ਺ 4XJGUͷ4*.% func abs(_ simd: Vector) -> Vector where Vector.Scalar: FloatingPoint { simd.replacing(with: -simd, where: simd .< 0) } let simd2 = SIMD2(1.0, -2.0) abs(simd2) // SIMD2(1.0, 2.0) let simd3 = SIMD3(1.0, -2.0, 3.0) abs(simd3) // SIMD2(1.0, 2.0, 3.0) ࢖༻ྫQSPUPDPM4*.%

Slide 64

Slide 64 text

wશͯͷ4*.%OͰ࢖͑Δؔ਺ 4XJGUͷ4*.% extension SIMD where Scalar: SIMDScalar { var xy: SIMD2 { self[.init(0, 1)] } var xyz: SIMD3 { self[.init(0, 1, 2)] } } let simd4 = SIMD4(0.0, 1.0, 2.0, 3.0) let xy = simd4.xy // SIMD2(0.0, 1.0) let xyz = simd4.xyz // SIMD3(0.0, 1.0, 2.0) ࢖༻ྫQSPUPDPM4*.%

Slide 65

Slide 65 text

4XJGUͷ4*.% wTUSVDU4*.%O4DBMBS4*.%4DBMBS4*.% wTUSVDU4*.%.BTL4UPSBHF4*.%4*.% ܕͱؔ܎

Slide 66

Slide 66 text

4XJGUͷ4*.% wTUSVDU4*.%.BTL4UPSBHF wཁૉຖͷൺֱ݁Ռ ܕͱؔ܎4*.%.BTL let a = SIMD3(1, 2, 3) let b = SIMD3(3, 2, 1) a == b // false a .== b // SIMDMask(false, true, false))

Slide 67

Slide 67 text

4XJGUͷ4*.% wTUSVDU4*.%.BTL ܕͱؔ܎4*.%.BTL let a = SIMD4(1, -1, 2, -2) let mask = a.<0 //SIMDMask>(false,true,false,true) // mask͕trueͷཁૉ͚ͩ`-a`Ͱஔ͖׵͑Δ a.replacing(with: -a, where: mask) // SIMD4(1, 1, 2, 2) // trueͳ΋ͷ͕ҰͭͰ΋͋Δ͔ any(mask) // true // ͢΂ͯtrue͔ all(mask) // false

Slide 68

Slide 68 text

4XJGUͷ4*.% wTUSVDU4*.%Oԋࢉ͕Ͱ͖Δݻఆ௕഑ྻ wTUSVDU4*.%.BTL4*.%Oͷൺֱ݁Ռ wQSPUPDPM4*.%4DBMBS4*.%Oʹ࢖͑Δཁૉ wQSPUPDPM4*.%4*.%OΛந৅Խ ܕͱؔ܎

Slide 69

Slide 69 text

extension SIMD2 where Scalar == UInt8 { public static func &+(a: Self, b: Self) -> Self { Self(Builtin.add_Vec2xInt8(a._storage._value, b._storage._value)) } public static func &-(a: Self, b: Self) -> Self { Self(Builtin.sub_Vec2xInt8(a._storage._value, b._storage._value)) } public static func &*(a: Self, b: Self) -> Self { Self(Builtin.mul_Vec2xInt8(a._storage._value, b._storage._value)) } } 4XJGUͷ4*.% Ͳ͏΍ͬͯ4*.%໋ྩΛൃߦ͍ͯ͠Δʁ

Slide 70

Slide 70 text

w#VJMUJOʢ૊ΈࠐΈʣؔ਺ w--7.্ͷ4*.%໋ྩʹม׵ w--7.͕ΞηϯϒϦʹ4*.%໋ྩΛग़ྗ 4XJGUͷ4*.% Ͳ͏΍ͬͯ4*.%໋ྩΛൃߦ͍ͯ͠Δʁ

Slide 71

Slide 71 text

4XJGUͷ4*.%໰୊఺

Slide 72

Slide 72 text

4XJGUͷ4*.% w૊ΈࠐΈؔ਺Ͱ࣮૷͍ͯ͠ͳ͍ॲཧ͕ଟ͍ ໰୊఺

Slide 73

Slide 73 text

4XJGUͷ4*.% w૊ΈࠐΈؔ਺Ͱ࣮૷͍ͯ͠ͳ͍ॲཧ͕ଟ͍ w'MPBUJOH1PJOU͸#VJMUJOͷ࣮૷͕ͳ͍ʂ ໰୊఺ // Implementations of floating-point operations. These should eventually all // be replaced with @_semantics to lower directly to vector IR nodes. extension SIMD where Scalar: FloatingPoint { public static func +(a: Self, b: Self) -> Self { var result = Self() for i in result.indices { result[i] = a[i] + b[i] } return result } }

Slide 74

Slide 74 text

4XJGUͷ4*.% w૊ΈࠐΈؔ਺Ͱ࣮૷͍ͯ͠ͳ͍ॲཧ͕ଟ͍ w'MPBUJOH1PJOU͸#VJMUJOͷ࣮૷͕ͳ͍ʂ wʢҰԠʣࣗಈϕΫτϧԽ͸ޮ͖΍͍͢ ໰୊఺ extension SIMD where Scalar: FloatingPoint { public static func +(a: Self, b: Self) -> Self { var result = Self() for i in result.indices { result[i] = a[i] + b[i] } return result } }

Slide 75

Slide 75 text

4XJGUͷ4*.% w.BUSJY RVBUFSOJPO͕ඇରԠ wճసΛදݱ w"DDFMFSBUFTJNEΛ࢖͏ඞཁ͋Γ ໰୊఺

Slide 76

Slide 76 text

·ͱΊ w4XJGUͷ4*.% wߴ଎ʹԋࢉͰ͖Δݻఆ௕഑ྻ w༻్ wը૾ॲཧͳͲߴ଎ͳॲཧ w࠲ඪදݱ

Slide 77

Slide 77 text

·ͱΊ w4XJGUͷ4*.% wߴ଎ʹԋࢉͰ͖Δݻఆ௕഑ྻ w༻్ wը૾ॲཧͳͲߴ଎ͳॲཧʢະ࣮૷ଟ਺ʣ w࠲ඪදݱ

Slide 78

Slide 78 text

·ͱΊ w4XJGUͷ4*.% wߴ଎ʹԋࢉͰ͖Δݻఆ௕഑ྻ w༻్ wը૾ॲཧͳͲߴ଎ͳॲཧʢະ࣮૷ଟ਺ʣ w࠲ඪදݱ

Slide 79

Slide 79 text

ࢀߟ

Slide 80

Slide 80 text

ࢀߟ w4&4*.%7FDUPST w IUUQTHJUIVCDPNBQQMFTXJGUFWPMVUJPOCMPCNBJOQSPQPTBMTTJNENE w4&4*.%BEEJUJPOT w IUUQTHJUIVCDPNTXJGUMBOHTXJGUFWPMVUJPOCMPCNBJOQSPQPTBMTTJNEBEEJUJPOTNE w"3.$16ʹ͓͚Δ4*.%Λ༻͍ͨߴ଎ܭࢉೖ໳ w IUUQTXXXTMJEFTIBSFOFUTMJEFTIPXBSNDQVTJNE