web-dev-qa-db-ja.com

SceneKitで「simd」接頭辞は何を意味しますか?

SCNNode(SIMD)という名前のSCNNodeカテゴリがあり、simdPositionsimdRotationなどのプロパティを宣言します。これらは元の/通常のプロパティpositionrotationの重複したプロパティのようです。

@property(nonatomic) simd_float3 simdPosition API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0));
@property(nonatomic) simd_float4 simdRotation API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0));

positionsimdPositionの違いは何ですか?接頭辞「simd」は正確にはどういう意味ですか?

22
ooOlly

SIMD:単一命令複数データ

SIMD命令を使用すると、複数の値に対して同じ操作を同時に実行できます。

例を見てみましょう

逐次アプローチ(SIMDなし)

4つのInt32値があります

let x0: Int32 = 10
let y0: Int32 = 20

let x1: Int32 = 30
let y1: Int32 = 40

2 xと2 yの値を合計したいので、

let sumX = x0 + x1 // 40
let sumY = y0 + y1 // 60

以前の2つのsumsを実行するには、CPUは

  1. x0とx1をメモリにロードして追加する
  2. y0とy1をメモリにロードして追加する

したがって、結果は2つの演算で得られます。

私はあなたにアイデアをよりよく示すためにいくつかのグラフィックを作成しました

ステップ1

enter image description here

ステップ2

enter image description here

SIMD

SIMDがどのように機能するかを見てみましょう。まず、適切なSIMD形式で保存された入力値が必要です。

let x = simd_int2(10, 20)
let y = simd_int2(30, 40)

ご覧のとおり、前のxyはベクトルです。実際、xyの両方に2つのコンポーネントが含まれています。

今書くことができます

let sum = x + y

前の操作を実行するためにCPUが何をするか見てみましょう

  1. メモリにxとyをロードして追加する

enter image description here

それでおしまい!

xの両方のコンポーネントとyの両方のコンポーネントは、同時に処理されます

並列プログラミング

私たちは[〜#〜]ではありません[〜#〜]並行プログラミングについて話していますが、代わりにこれは本当の並列ですプログラミング

特定の操作で想像できるように、SIMDのアプローチはシリアルのアプローチよりもはるかに高速です。

シーンキット

シーンキットの例を見てみましょう

追加したい10を、シーンノードのすべての直接の子孫のxy、およびzコンポーネントに追加します。

古典的なシリアルアプローチを使用して、

for node in scene.rootNode.childNodes {
    node.position.x += 10
    node.position.y += 10
    node.position.z += 10
}

ここでは合計childNodes.count * 3操作が実行されます。

SIMD命令で前のコードを変換する方法を見てみましょう

let delta = simd_float3(10)
for node in scene.rootNode.childNodes {
    node.simdPosition += delta
}

このコードは、以前のコードよりもはるかに高速です。 2倍か3倍かはわかりませんが、信じてください。

要約

異なる値に対して同じ操作を数回実行する必要がある場合は、SIMDプロパティを使用するだけです:)

58
Luca Angeletti

SIMDは、<simd/simd.h>からインポートできる vector types の上に構築された小さなライブラリです。これにより、より表現力とパフォーマンスの高いコードが可能になります。

たとえば、SIMDを使用すると、次のように記述できます。

simd_float3 result = a + 2.0 * b;

の代わりに

SCNVector3 result = SCNVector3Make(a.x + 2.0 * b.x, a.y + 2.0 * b.y, a.z + 2.0 * b.z);

Objective-Cでは、メソッドをオーバーロードできません。つまり、両方を持つことはできません

@property(nonatomic) SCNVector3 position;
@property(nonatomic) simd_float3 position API_AVAILABLE(macos(10.13), ios(11.0), tvos(11.0), watchos(4.0));

新しいSIMDベースのAPIには別の名前が必要でした。そのため、SceneKitはsimdPositionを公開しています。

9
mnuages