Slide 1

Slide 1 text

iOSDC 2017 Shuichi Tsutsumi @shu223 ඈͼಓ۩Ͱ͸ͳ͍

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

WWDC 2014

Slide 4

Slide 4 text

ͦ͏ʮΞϨʯ͕ൃද͞Εͨ೥

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

SwiftͱMetal͸ಉ͍೥!

Slide 8

Slide 8 text

WWDC2014ͰͷMetalͷσϞ

Slide 9

Slide 9 text

WWDC2014ͰͷSwiftൃද

Slide 10

Slide 10 text

! !

Slide 11

Slide 11 text

Metalʢ࠶ʣ

Slide 12

Slide 12 text

" "

Slide 13

Slide 13 text

ʰMetalɾɾɾ͏ͪʹ͸ؔ܎ͳ͍ͳ͊ʱ

Slide 14

Slide 14 text

γΣʔμͰ͜Μͳʮදݱʯ΋Ͱ͖·͢ʂ .FUBMγΣʔμ͜ͱ͸͡Ί8FC(-(-4-ͷ๛෋ͳαϯϓϧΛࢀߟʹ͢Δ2JJUB ※ಈը΍ը૾Ͱ͸ͳ͘ɺ͢΂ͯϓϩάϥϜͰੜ੒͍ͯ͠·͢

Slide 15

Slide 15 text

ʢઈରϓϩμΫτͰ͸΍Βͳ͍ɾɾɾʣ

Slide 16

Slide 16 text

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

Metal GPU • Core ML • Vision • Core Image • SceneKit • SpriteKit • MapKit

Slide 19

Slide 19 text

Metal GPU • Core ML • Vision • Core Image • SceneKit • SpriteKit • MapKit • Core Animation • UIKit

Slide 20

Slide 20 text

143,000 MetalͷAPIΛ௚઀ར༻͍ͯ͠ΔΞϓϦͷ਺

Slide 21

Slide 21 text

143,000 17,000,000 MetalͷAPIΛ௚઀ར༻͍ͯ͠ΔΞϓϦͷ਺ MetalͷAPIΛ҉໧తʹར༻͍ͯ͠ΔΞϓϦͷ਺

Slide 22

Slide 22 text

͋ͳͨͷΞϓϦͷԼͰ΋ Metal͕҉༂͍ͯ͠Δʂ

Slide 23

Slide 23 text

ඈͼಓ۩Ͱ͸ͳ͍.FUBM

Slide 24

Slide 24 text

఻͍͑ͨ͜ͱ ✓Metal͸ؔ܎ͳ͘ͳ͍ ✓Metalͷجૅ ✓Metalͷ࣮૷ํ๏

Slide 25

Slide 25 text

imageView.image = image

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

Կ͕ى͖͍ͯΔͷ͔ʁ

Slide 28

Slide 28 text

σΟεϓϨΠ ϓϩηοα ϑϨʔϜ
 όοϑΝ

Slide 29

Slide 29 text

σΟεϓϨΠ ϓϩηοα ϑϨʔϜ
 όοϑΝ ը໘෼ͷ ϐΫηϧσʔλ

Slide 30

Slide 30 text

σΟεϓϨΠ ϓϩηοα ϑϨʔϜ
 όοϑΝ ը໘෼ͷ ϐΫηϧσʔλ ϐΫηϧσʔλ
 දࣔ

Slide 31

Slide 31 text

σΟεϓϨΠ ϓϩηοα ϑϨʔϜ
 όοϑΝ ը໘෼ͷ ϐΫηϧσʔλ ඵؒʹճ ॻ͖ࠐΉ ϐΫηϧσʔλ
 දࣔ

Slide 32

Slide 32 text

σΟεϓϨΠ ϓϩηοα ϑϨʔϜ
 όοϑΝ ը໘෼ͷ ϐΫηϧσʔλ ඵؒʹճ ॻ͖ࠐΉ ϐΫηϧσʔλ
 දࣔ ղ૾౓͕ߴ͘ͳΔ΄Ͳେม

Slide 33

Slide 33 text

CPUͱGPUͷੑ࣭ͷҧ͍ CPU͸εϙʔπΧʔ • ͱʹ͔͘଎͍ • Ұ౓ʹଟ͘ͷਓΛӡ΂ͳ͍ GPU͸όε • ಉ͡໨త஍ͷਓΛҰ౓ʹଟ͘ӡ΂Δ • ଎౓ࣗମ͸CPUʹ͸ٴ͹ͳ͍

Slide 34

Slide 34 text

• CPU͸଎ͯ͘ɺԿͰ΋Ͱ͖Δʢ൚༻ϓϩηοαʣ - ͔ͱ͍ͬͯԿͰ΋΍ΒͤΔͱɺ͙͢ʹՔಇ཰100%ʹ • GPU͕ಘҙͳ࢓ࣄʢʹฒྻԋࢉʣ͸GPUʹ΍ΒͤΔ - ಉ͡ܭࢉΛߦ͏ॲཧ - ௖఺ͷܭࢉʢ࠲ඪม׵ʣ - ϥΠςΟϯά - ͦͷଞϐΫηϧ͝ͱͷॲཧ

Slide 35

Slide 35 text

σΟεϓϨΠ ϓϩηοα ϑϨʔϜ
 όοϑΝ 1ඵؒʹ60ճ ॻ͖ࠐΉ • CPU͸৭Μͳ͜ͱͰ๩͍͠ • ϐΫηϧ͝ͱͷܭࢉɺϑϨʔϜόοϑΝ ΁ͷॻ͖ࠐΈ͸ฒྻॲཧOK ղ૾౓͕ߴ͘ͳΔ΄Ͳେม 1ը໘෼ͷϐΫηϧσʔλ

Slide 36

Slide 36 text

σΟεϓϨΠ ϓϩηοα ϑϨʔϜ
 όοϑΝ 1ඵؒʹ60ճ ॻ͖ࠐΉ • CPU͸৭Μͳ͜ͱͰ๩͍͠ • ϐΫηϧ͝ͱͷܭࢉɺϑϨʔϜόοϑΝ ΁ͷॻ͖ࠐΈ͸ฒྻॲཧOK GPU ղ૾౓͕ߴ͘ͳΔ΄Ͳେม 1ը໘෼ͷϐΫηϧσʔλ

Slide 37

Slide 37 text

మଇ: GPU͕ಘҙͳ࢓ࣄ͸GPUʹ

Slide 38

Slide 38 text

GPUΛૢΔ

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

GPU΁ͷΞΫηεΛఏڙ GPU Your app ???

Slide 41

Slide 41 text

OpenGLͱͷҧ͍

Slide 42

Slide 42 text

OpenGL • Ҏલ͔Β͋ΔάϥϑΟοΫεAPI • ֤ࣾͷϋʔυ΢ΣΞɾϓϥοτϑΥʔϜʹରԠ • Appleͷϋʔυ΢ΣΞ͚ͩʹ࠷దԽ͞Ε͍ͯΔΘ͚Ͱ͸ ͳ͍

Slide 43

Slide 43 text

Metal • Apple͕ಠࣗʹࡦఆ • Appleͷϋʔυ΢ΣΞʹ࠷దԽ • OpenGLΑΓ࠷େ10ഒߴ଎ • ࠓ͸OpenGL࣮૷ͷԼճΓ΋Metal

Slide 44

Slide 44 text

ͷ࣮૷

Slide 45

Slide 45 text

imageView.image = image

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

Metal APIΛʮ໌ࣔతʹʯୟ͍ͯ ը૾Λඳը͢Δ৔߹ͷ࠷খ࣮૷

Slide 48

Slide 48 text

func draw(in view: MTKView) { guard let drawable = view.currentDrawable else {return} guard let commandBuffer = commandQueue.makeCommandBuffer() else {fatalError()} 
 guard let blitEncoder = commandBuffer.makeBlitCommandEncoder() else {fatalError()} let targetW = min(texture.width, drawable.texture.width) let targetH = min(texture.height, drawable.texture.height) blitEncoder.copy(from: texture, sourceSlice: 0, sourceLevel: 0, sourceOrigin: MTLOrigin(x: 0, y: 0, z: 0), sourceSize: MTLSizeMake(targetW, targetH, texture.depth), to: drawable.texture, destinationSlice: 0, destinationLevel: 0, destinationOrigin: MTLOrigin(x: 0, y: 0, z: 0)) blitEncoder.endEncoding() commandBuffer.present(drawable) commandBuffer.commit() commandBuffer.waitUntilCompleted() } private let device = MTLCreateSystemDefaultDevice()! 
 private func setup() { commandQueue = device.makeCommandQueue() let textureLoader = MTKTextureLoader(device: device) texture = try! textureLoader.newTexture(name: "highsierra", scaleFactor: view.contentScaleFactor, bundle: nil) mtkView.device = device mtkView.delegate = self mtkView.colorPixelFormat = texture.pixelFormat }

Slide 49

Slide 49 text

ʮ࠷খݶʯͷ࣮૷Ͱొ৔͢ΔΫϥε • MTLDevice • MTLCommandQueue • MTLCommandBuffer • MTLCommandEncoder • MTLTexture • MTKView • MTKTextureLoader • etc…

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

$ ͔͕ͨը૾Λදࣔ͢Δ͙Β͍Ͱͳͥ͜Μͳʹɻɻ

Slide 52

Slide 52 text

ཧղͷखҾ͖

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

$16͸ɺ(16΁ͷ໋ྩΛ
 ίϚϯυόοϑΝͱ͍͏ܗͰ࡞੒

Slide 55

Slide 55 text

$16͸ɺ(16΁ͷ໋ྩΛ
 ίϚϯυόοϑΝͱ͍͏ܗͰ࡞੒ (16ʹ౉͢

Slide 56

Slide 56 text

$16͸ɺ(16΁ͷ໋ྩΛ
 ίϚϯυόοϑΝͱ͍͏ܗͰ࡞੒ (16͸౉͞ΕͨίϚ ϯυΛ࣮ߦ͢Δ (16ʹ౉͢

Slide 57

Slide 57 text

$16͸ɺ(16΁ͷ໋ྩΛ
 ίϚϯυόοϑΝͱ͍͏ܗͰ࡞੒ $16ͱ(16͸྆ํ͔ΒΞΫη εͰ͖ΔϝϞϦྖҬΛ࣋ͭ (16͸౉͞ΕͨίϚ ϯυΛ࣮ߦ͢Δ (16ʹ౉͢

Slide 58

Slide 58 text

MTLCommandBuffer MTLTexture MTLDevice

Slide 59

Slide 59 text

MTLCommandBuffer MTLTexture MTLDevice MTLCommandEncoder

Slide 60

Slide 60 text

MTLCommandBuffer MTLTexture MTLDevice MTLCommandQueue MTLCommandEncoder

Slide 61

Slide 61 text

MTLCommandBuffer MTLTexture MTLDevice MTLCommandQueue MTKTextureLoader MTLCommandEncoder

Slide 62

Slide 62 text

۩ମతʹݟ͍͖ͯ·͠ΐ͏

Slide 63

Slide 63 text

MTLDevice let device = MTLCreateSystemDefaultDevice()! ※Τϥʔॲཧ౳͸লུ͍ͯ͠·͢

Slide 64

Slide 64 text

MTLTexture, MTKTextureLoader // ϩʔμʔΛॳظԽ loader = MTKTextureLoader(device: device) // ςΫενϟΛΞηοτΧλϩά͔Βڞ༗ϝϞϦྖҬʹϩʔυ texture = try! loader.newTexture(
 name: “hoge", 
 scaleFactor: view.contentScaleFactor, 
 bundle: nil) ※Τϥʔॲཧ౳͸লུ͍ͯ͠·͢

Slide 65

Slide 65 text

MTLCommandQueue, MTLCommandBuffer // ίϚϯυΩϡʔ͔ΒίϚϯυόοϑΝΛ࡞੒ let commandBuffer = commandQueue.makeCommandBuffer()! // … ίϚϯυόοϑΝʹίϚϯυ௥Ճ // ίϚϯυόοϑΝΛίϛοτʢʹΤϯΩϡʔ͞ΕΔʣ commandBuffer.commit() ※Τϥʔॲཧ౳͸লུ͍ͯ͠·͢ // ίϚϯυΩϡʔΛॳظԽ commandQueue = device.makeCommandQueue()

Slide 66

Slide 66 text

MTLCommandEncoder • ίϚϯυόοϑΝʹίϚϯυΛ௥ՃʢΤϯίʔυʣ͢Δ MTLRenderCommandEncoder άϥϑΟοΫεϨϯμϦϯάίϚϯυΛΤϯίʔυ͢Δ MTLComputeCommandEncoder ฒྻԋࢉॲཧΛΤϯίʔυ͢Δ MTLBlitCommandEncode όοϑΝɾςΫενϟؒͷίϐʔॲཧΛΤϯίʔυ͢Δ

Slide 67

Slide 67 text

MTLCommandEncoder (MTLBlitCommandEncoder) let blitEncoder = commandBuffer.makeBlitCommandEncoder()! blitEncoder.copy(from: texture, sourceSlice: 0, sourceLevel: 0, sourceOrigin: srcOrigin, sourceSize: srcSize, to: drawable.texture, destinationSlice: 0, destinationLevel: 0, destinationOrigin:dstOrigin) blitEncoder.endEncoding() ※Τϥʔॲཧ౳͸লུ͍ͯ͠·͢

Slide 68

Slide 68 text

MTLCommandEncoder (MTLBlitCommandEncoder) let blitEncoder = commandBuffer.makeBlitCommandEncoder()! blitEncoder.copy(from: texture, sourceSlice: 0, sourceLevel: 0, sourceOrigin: srcOrigin, sourceSize: srcSize, to: drawable.texture, destinationSlice: 0, destinationLevel: 0, destinationOrigin:dstOrigin) blitEncoder.endEncoding() ※Τϥʔॲཧ౳͸লུ͍ͯ͠·͢ ίϐʔݩ ίϐʔઌ

Slide 69

Slide 69 text

// ίϚϯυΩϡʔ͔ΒίϚϯυόοϑΝΛ࡞੒ let commandBuffer = commandQueue.makeCommandBuffer()! // ίϚϯυΤϯίʔμΛ࡞੒ let blitEncoder = commandBuffer.makeBlitCommandEncoder()! blitEncoder.copy(from: texture, sourceSlice: 0, sourceLevel: 0, sourceOrigin: srcOrigin, sourceSize: srcSize, to: drawable.texture, destinationSlice: 0, destinationLevel: 0, destinationOrigin:dstOrigin) // ίϚϯυ௥Ճ׬ྃ blitEncoder.endEncoding() // ίϚϯυόοϑΝΛίϛοτʢʹΤϯΩϡʔ͞ΕΔʣ commandBuffer.commit() ※Τϥʔॲཧ౳͸লུ͍ͯ͠·͢

Slide 70

Slide 70 text

private let device = MTLCreateSystemDefaultDevice()! private func setup() { commandQueue = device.makeCommandQueue() let textureLoader = MTKTextureLoader(device: device) texture = try! textureLoader.newTexture(name: "highsierra", scaleFactor: view.contentScaleFactor, bundle: nil) mtkView.device = device mtkView.delegate = self mtkView.colorPixelFormat = texture.pixelFormat } func draw(in view: MTKView) { guard let drawable = view.currentDrawable else {return} guard let commandBuffer = commandQueue.makeCommandBuffer() else {fatalError()} 
 guard let blitEncoder = commandBuffer.makeBlitCommandEncoder() else {fatalError()} let targetW = min(texture.width, drawable.texture.width) let targetH = min(texture.height, drawable.texture.height) blitEncoder.copy(from: texture, sourceSlice: 0, sourceLevel: 0, sourceOrigin: MTLOrigin(x: 0, y: 0, z: 0), sourceSize: MTLSizeMake(targetW, targetH, texture.depth), to: drawable.texture, destinationSlice: 0, destinationLevel: 0, destinationOrigin: MTLOrigin(x: 0, y: 0, z: 0)) blitEncoder.endEncoding() commandBuffer.present(drawable) commandBuffer.commit() commandBuffer.waitUntilCompleted() }

Slide 71

Slide 71 text

private let device = MTLCreateSystemDefaultDevice()! private func setup() { commandQueue = device.makeCommandQueue() let textureLoader = MTKTextureLoader(device: device) texture = try! textureLoader.newTexture(name: "highsierra", scaleFactor: view.contentScaleFactor, bundle: nil) mtkView.device = device mtkView.delegate = self mtkView.colorPixelFormat = texture.pixelFormat } ίϚϯυόοϑΝ࡞੒ → ΤϯΩϡʔ →ʢGPU΁ૹ৴ʣ →ʢGPUͰίϚϯυ࣮ߦʣ →ʢඳըʣ func draw(in view: MTKView) { guard let drawable = view.currentDrawable else {return} guard let commandBuffer = commandQueue.makeCommandBuffer() else {fatalError()} 
 guard let blitEncoder = commandBuffer.makeBlitCommandEncoder() else {fatalError()} let targetW = min(texture.width, drawable.texture.width) let targetH = min(texture.height, drawable.texture.height) blitEncoder.copy(from: texture, sourceSlice: 0, sourceLevel: 0, sourceOrigin: MTLOrigin(x: 0, y: 0, z: 0), sourceSize: MTLSizeMake(targetW, targetH, texture.depth), to: drawable.texture, destinationSlice: 0, destinationLevel: 0, destinationOrigin: MTLOrigin(x: 0, y: 0, z: 0)) blitEncoder.endEncoding() commandBuffer.present(drawable) commandBuffer.commit() commandBuffer.waitUntilCompleted() } ɾɾɾίϚϯυΩϡʔੜ੒ ςΫενϟΛϩʔυ ϏϡʔͷηοτΞοϓ ɾɾɾσόΠεੜ੒

Slide 72

Slide 72 text

% എܠʹ͋Δ֓೦Λ౿·͑Δͱҙ֎ͱ؆୯

Slide 73

Slide 73 text

Powered by

Slide 74

Slide 74 text

GPUΛૢΕΔΑ͏ʹʂ GPU Your app ???

Slide 75

Slide 75 text

૿͑ଓ͚ΔMetal׆༻ͷ৔ • ARKitͷΧελϜϨϯμϦϯά • MPS CNN / RNNΛ༻͍ͨػցֶश • Core ImageͷΧελϜϑΟϧλ

Slide 76

Slide 76 text

ࢀߟॻ੶ GPU Metal

Slide 77

Slide 77 text

·ͱΊ • Metal͸ؔ܎ͳ͘ͳ͍ - UIKitͷԼճΓͱͯ͠΋҉༂ • GPU͕ಘҙͳ࢓ࣄ͸GPUʹ೚ͤΑ͏ • Metalͷجૅ - Metalͱ͸ / OpenGLͱͷൺֱ • Metalͷ࣮૷ - എܠʹ͋Δ֓೦Λཧղ͢Δͱ؆୯

Slide 78

Slide 78 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ https://github.com/shu223