ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
SwiftのAccelerateの紹介
Accelerateフレームワークでは、デバイスで実行されるシステムアーキテクチャに高度に最適化された、数百種類もの計算機能を利用できます。このセッションでは、そうした強力な機能をSwiftで直接利用する方法を紹介します。ベクトルプログラミングの力により、どのようにiOS、macOS、tvOS、watchOSのAppで素晴らしいパフォーマンスを実現できるかについてご確認ください。
リソース
関連ビデオ
WWDC21
-
ダウンロード
(音楽)
Vector and Numericsグループの グラッドマンです 2つのことを お話しします まずは新しいSwift Overlayを 紹介し 次にAccelerateのパフォーマンスを 測定します 本題に入る前に Accelerateの概要を述べます
AccelerateはCPUで動作する 低水準な数学的データを提供し 画像処理や信号処理 ベクトル演算などをサポートします データはマイクロアーキテクチャに 合わせ 調整されるので パフォーマンスが向上し エネルギーの節約にもつながります
アプリケーションの開発に Accelerateを使えば 処理速度が速まり バッテリーが長持ちします
データは全プラットフォームに 提供されます macOSやiOSだけではなく watchOSやtvOSにも
ユーザエクスペリエンスが向上します
しかしインターフェイスに問題があり 開発者には 好まれない傾向にありました そこで4つのライブラリ向けに 新しくAPIを作り 簡単に使えるようにしました 4つのライブラリの1つ目は デジタル信号処理のルーチンを 提供するvDSP これは大きなベクトルの演算や フーリエ変換の他― Biquadratic filteringなどが 行えます
2つ目は 三角関数や対数ルーチンといった― 算術と超越関数を提供するvForce
3つ目は 関数の数値積分のためのQuadrature 4つ目は 画像処理機能を提供するvImage これはコアグラフィックとビデオを 統合します
Accelerateの特徴は ベクトル化にあります
Scalarコードを使った計算と ベクトル化を比べてみましょう 例えば1配列の要素と要素を 掛け合わせ 4つのループを使うとします 要素はペアごとにロードされ 掛け合わせた結果が保存されます 1配列目のaとbを掛け合わせ cが出たら 2つ目へ進みます そして3つ目 4つ目へと進みます
Accelerateを使う場合 SIMDレジスタにより 計算が実行されます 複数データを 1つのレジスタにまとめることで 一度に同じ命令を実行できます 例えば1つの128ビットレジスタは 32ビットの浮動小数点数の値を 4つ格納できます つまりベクトル化された操作は 同時に 4組の掛け算を行います 処理が速くなるだけでなく エネルギーの節約にもなります
これはデジタル信号処理のライブラリ vDSPの一例です まずはvDSPのAPIからお話しします
vDSPは フーリエ変換や Biquadratic filteringといった― ベクトル化したデジタル信号処理の 機能を提供します 更に 要素の算術や型変換といった― 強力で一般的な機能も提供します
今すぐ信号の結合性を 計算する必要はないかもしれません しかしvDSPがアプリケーションの パフォーマンスを 向上させる可能性があります
基本的な算術を見てみましょう 例えば4列の単精度値が あるとします 1配列中の2要素の合計と 残りの2要素の差を出し その2つを掛け合わせます
4ループ使って計算すれば 期待した結果が得られます
vDSPの従来のAPIを使えば 4ループより 約3倍速くなります
こちらは新しいAPIを使った場合 名前空間で機能が示されているので 操作内容を把握できます 新しい関数は配列など 使い慣れた型で機能するので countを渡す必要がありません なので関数のコールが 簡素化されます
初期化した結果の配列を渡すと 効率が良いだけでなく その配列を再利用できます
しかし自己割り当て機能も 提供します 配列の初期化されていない バッファにアクセスし 計算の結果を返します これはストレージを渡すより遅いものの Scalarより速く コードが単純化されることもあります
vDSPは型変換もベクトル化します 例えば倍精度値を含む配列を ゼロに丸める16ビットの 符号なし整数値に変換します
Scalarコードは合理的な手法で 丸めを示すマップを使います しかしvDSPはベクトル化できます
既存のAPIはScalarより 約4倍速くなります
新しい関数は 明確なインターフェイスを提供します この関数が受け入れるのは 各要素を変換する整数型と 丸めを指定する列挙型です
vDSPは時間領域と 周波数領域の間の 1次元と2次元のデータを フーリエ変換します
信号を順方向に変換すると 正弦波に分解されます それが周波数領域の表現 その周波数領域の表現を 逆変換すると 元の信号が作られ 時間領域の表現となります フーリエ変換は 信号や画像処理で使われます 例えば音声信号を 順方向へ変換すれば 特定の周波数を調整し イコライズできます
従来のAPIを使ってみます まずsetupオブジェクトを作り 変換したい要素の数と方向を 指定します 次に2つ配列を作り Excute関数を実行 最後にリソースを解放するため 設定を破棄します
新しいAPIは手順を単純化します transformはDFTインスタンスの パラメータ名を備え リソースを自動的に開放します
先ほど同様に 自動割り当てバージョンがあり 結果の配列を返します
音声データを扱うなら Biquadratic filteringを ご存じでしょう これは音声をイコライズして 周波数応答を成形し 低周波数や高周波数を取り除きます
シングル及び マルチチャンネルの信号を操作し フィルタオブジェクトを使います フィルタはカスケードされています つまり信号全体が 順番に通り抜けます この方程式の係数により フィルタは定義されます
これらの値がローパスフィルタを 形成し 高周波を低減するとします これは既存のAPIを使い Biquadraticを セットアップするコードです
signalという配列に適用し outputに結果を返します 新しいAPIでは どうでしょうか?
同じ機能を示すのに 大幅に簡略化されています 係数をイニシャライザに渡し チャンネルとセクションの数を指定
関数を1つコールすれば完了です
次は大規模な配列で 高速演算を行うvForce そのAPIを見ていきましょう
vForceは 指数演算や対数演算など― vDSPにはない超越関数を提供します
典型的な例として 大きな配列で平方根を計算します Scalarコードにはマップが使えます
vForceは ベクトル化した機能を提供し Scalarコードより最大10倍速く 計算します
vDSPと同じように 新しいAPIを使えば パフォーマンスと エネルギー効率が向上します
自己割り当てバージョンもあり 各要素の平方根を含む 配列を返します
次はQuadratureです
Quadratureは曲線に囲まれた領域を 求める求積法でもあります 有限もしくは無限空間にわたる 定積分関数の近似値を提供します Quadratureを使って スライドの関数を積分し 緑の半円の近似値を出してみます
Biquadraticと同様に 既存のAPIには 大量のコードが必要です まず積分関数を表す構造を 定義します
次にアルゴリズムなど オプションを定義します
オプションの定義が済めば Quadratureを使い 積分を実行できます
新しいAPIはコードを単純化します 被積分関数を C関数のポインタではなく クロージャとして積分できるのは 大きな利点です つまり値を簡単に渡せます
integratorは 関連値を備えた列挙型なので Intervalなどのポイントを 与える必要はありません
全体に適用されるintegratorには ポイントを指定した列挙型を 渡せます
次は画像処理のライブラリ用に 作ったAPIです
画像処理のツールを備えたvImageは コアグラフィックやビデオと シームレスに連携します 可能な処理は アルファブレンディングや フォーマット変換 ヒストグラムの操作 それから コンボリューション ジオメトリ Morphologyなどです
vImageを簡単に使えるように 多くの新しい機能を導入しました フラグを実装しています Swiftのエラーをスローします 可変性やアンマネージ型作業の 要件を隠します
コアグラフィック画像の作業には データをバッファに取り込む ワークフローがあります
まずCG画像の フォーマットの記述を作成します 次にバッファをインスタンス化し 画像からバッファを初期化します 最後にSwift以外の方法で エラーをチェックします コードがたくさん並んでいます
新しいAPIでは 1つのイニシャライザのみです
しかしCG画像のフォーマットを 後で使うために 同様の機能を 2段階に分け実装します CG画像のフォーマットに 新しいイニシャライザと― 代替のバッファのイニシャライザを 加えます
バッファのコンテンツから CG画像を作るためには 既存のvImageの関数は こうなります 新しいAPIでは CG画像を作るメソッドも簡略化し 画像から生成したフォーマットを 使います
vImageはドメインやフォーマットの 変換にも重宝します Any-to-Anyコンバータは 異なるフォーマットでも コアビデオやグラフィックを 変換できます 例えばCMYKからRGBへ 変換するとします
既存のAPIはソースと 変換後のフォーマットのために UnmanagedConvertorを作り 返します コンバータの管理されたリファレンスを 変換の関数に渡します
新しいAPIは静的なmake関数を足し コンバータのインスタンスを 返します
変換にはインスタンスの変換メソッドを 使います 最後にコアビデオの画像フォーマットを 使った作業を見ましょう 例えば画像フォーマットの説明を ピクセルバッファから作り チャンネル数を計算するとします
既存のAPIを使うと これだけのコードが必要になります
新しいAPIなら2行で済みます make関数を使い ビデオ画像のフォーマット用に― インスタンスを作ります そしてプロパティとして チャンネル数にアクセスします
新しいAPIをいくつか紹介しました 最後にLinpack Benchmarkを使い Accelerateの速さと エネルギー効率についてお話しします Linpack Benchmarkは線形代数の 高速計算用に 一連のルーチンとして始まった ライブラリです これは後にLAPACKという ライブラリに まとめられました LAPACKはキャッシュを利用するために 開発されました ブロック化されたアルゴリズムで 構成されています これらのアルゴリズムは BLASというライブラリの上に 構築されています BLASについては後ほど説明します BLASの上のLAPACK上で Linpackは動作します
Linpackはプラットフォームの 計算速度を測定します 2ステップで行います すなわち 行列の因数分解と バックソールです アルゴリズムを修理すると プラットフォームにより 実行具合が異なることに気づきます Linpackは進化してきました 100×100のシステムから始まり 1000×1000のシステムを 解決しました 現在よく使われるバリアントでは 問題のサイズに制限がありません 今日はこのバリアントを使います
iPhone XS上のパフォーマンスを 比較します オレンジは最適化されていない Linpackを実行し Accelerateは使いません 未調整のソフトウェアを使います どうなるでしょうか
Accelerateを使った場合と 比較します つまりプラットフォームは 同じですが 調整済みのAccelerateを使います
Accelerateを使い 約24倍速くなりました これはバッテリーの節約にも つながるでしょう 今度はGEMMというLinpackのための 主要なルーチンを見ていきます
LAPACK上で動作するLinpackは BLAS上に構築されています GEMMはBLAS内にあるルーチンです LAPACKの ブロック化アルゴリズム内で使われ BLASのブロック化ルーチンを 実装します 行列の因数分解や ソルバールーチンに使われるため パフォーマンスのプロキシとして 使われたりもします 今日はGEMMの単精度バリアントに 注目します
EigenライブラリとAccelerateの パフォーマンスを比較しましょう 両方ともiPhone XS上で動作し 単精度の行列乗数を実行します Eigenの速さは?
51ギガフロップスを超えました Accelerateは?
同じプラットフォーム上のEigenより 約2.5倍高速です Accelerateは手動で調整されるため プラットフォームの機能を 最大限生かせるのです Accelerateを使用すれば パフォーマンスが向上します エネルギー効率が良くなり バッテリーが長持ちし ユーザエクスペリエンスも 良くなります
Accelerateは大規模な数学的計算と 画像計算を 高速かつエネルギー効率良く行います 更に新しいAPIにより ライブラリが使いやすくなり パフォーマンスも エネルギー効率も向上します Accelerateフレームワークに 関する情報は 当社のサイトを参考にしてください ご清聴ありがとうございました
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。