返回

AR 开发中常见的 simd 函数大盘点

IOS

概述

simd(单指令多数据流)是一种计算机体系结构,它允许处理器一次对多个数据项执行相同的操作。这可以极大地提高某些类型计算的性能,例如图像处理和视频编码。

在 AR 开发中,simd 函数可用于优化各种任务,例如矩阵运算、向量运算和四元数运算。通过使用 simd 函数,开发者可以显着提高应用程序的性能。

向量类型

向量类型是 simd 函数中最基本的数据类型。它由多个标量元素组成,这些元素可以同时进行处理。向量类型有许多不同的变体,最常见的变体是浮点向量和整数向量。

向量构建函数

向量构建函数用于创建新的向量对象。这些函数可以从标量值、数组或其他向量对象创建向量。例如,以下代码创建一个包含四个浮点值的向量:

__m128 vec = _mm_set_ps(1.0f, 2.0f, 3.0f, 4.0f);

向量运算函数

向量运算函数用于对向量进行各种操作。这些操作包括加法、减法、乘法、除法和比较。例如,以下代码将两个向量相加:

__m128 vec1 = _mm_set_ps(1.0f, 2.0f, 3.0f, 4.0f);
__m128 vec2 = _mm_set_ps(5.0f, 6.0f, 7.0f, 8.0f);
__m128 result = _mm_add_ps(vec1, vec2);

向量比较函数

向量比较函数用于比较两个向量。这些函数可以比较向量的各个元素,或者比较向量的长度。例如,以下代码比较两个向量的长度:

__m128 vec1 = _mm_set_ps(1.0f, 2.0f, 3.0f, 4.0f);
__m128 vec2 = _mm_set_ps(5.0f, 6.0f, 7.0f, 8.0f);
int result = _mm_comilt_ps(vec1, vec2);

矩阵类型

矩阵类型是 simd 函数中另一种常见的数据类型。它由多个向量组成,这些向量可以同时进行处理。矩阵类型有许多不同的变体,最常见的变体是浮点矩阵和整数矩阵。

矩阵构建函数

矩阵构建函数用于创建新的矩阵对象。这些函数可以从标量值、数组或其他矩阵对象创建矩阵。例如,以下代码创建一个包含四个向量的矩阵:

__m128 vec1 = _mm_set_ps(1.0f, 2.0f, 3.0f, 4.0f);
__m128 vec2 = _mm_set_ps(5.0f, 6.0f, 7.0f, 8.0f);
__m128 vec3 = _mm_set_ps(9.0f, 10.0f, 11.0f, 12.0f);
__m128 vec4 = _mm_set_ps(13.0f, 14.0f, 15.0f, 16.0f);
__m128 mat = _mm_set_ps(vec1, vec2, vec3, vec4);

矩阵运算函数

矩阵运算函数用于对矩阵进行各种操作。这些操作包括加法、减法、乘法、除法和比较。例如,以下代码将两个矩阵相加:

__m128 mat1 = _mm_set_ps(1.0f, 2.0f, 3.0f, 4.0f,
                            5.0f, 6.0f, 7.0f, 8.0f,
                            9.0f, 10.0f, 11.0f, 12.0f,
                            13.0f, 14.0f, 15.0f, 16.0f);
__m128 mat2 = _mm_set_ps(17.0f, 18.0f, 19.0f, 20.0f,
                            21.0f, 22.0f, 23.0f, 24.0f,
                            25.0f, 26.0f, 27.0f, 28.0f,
                            29.0f, 30.0f, 31.0f, 32.0f);
__m128 result = _mm_add_ps(mat1, mat2);

矩阵比较函数

矩阵比较函数用于比较两个矩阵。这些函数可以比较矩阵的各个元素,或者比较矩阵的秩。例如,以下代码比较两个矩阵的秩:

__m128 mat1 = _mm_set_ps(1.0f, 2.0f, 3.0f, 4.0f,
                            5.0f, 6.0f, 7.0f, 8.0f,
                            9.0f, 10.0f, 11.0f, 12.0f,
                            13.0f, 14.0f, 15.0f, 16.0f);
__m128 mat2 = _mm_set_ps(17.0f, 18.0f, 19.0f, 20.0f,
                            21.0f, 22.0f, 23.0f, 24.0f,
                            25.0f, 26.0f, 27.0f, 28.0f,
                            29.0f, 30.0f, 31.0f, 32.0f);
int result = _mm_comilt_ps(mat1, mat2);

四元数类型

四元数类型是 simd 函数中另一种常见的数据类型。它由四个标量元素组成,这些元素可以同时进行处理。四元数类型通常用于表示旋转。

四元数构建函数

四元数构建函数用于创建新的四元数对象。这些函数可以从标量值、数组或其他四元数对象创建四元数。例如,以下代码创建一个包含四个浮点值的四元数:

__m128 quat = _mm_set_ps(1.0f, 0.0f, 0.0f, 0.0f);

四元数运算函数

四元数运算函数用于对四元数进行各种操作。这些操作包括加法、减法、乘法、除法和比较。例如,以下代码将两个四元数相加:

__m128 quat1 = _mm_set_ps(1.0f, 0.0f, 0.0f, 0.0f);
__m128 quat2 = _mm_set_ps(0.0f, 1.0f, 0.0f, 0.0f);
__m128 result = _mm_add_ps(quat1, quat2);

四元数比较函数

四元数比较函数用于比较两个四元数。这些函数可以比较四元数的各个元素,或者比较四元数的长度。例如,以下代码比较两个四元数的长度:

__m128 quat1 = _mm_set_ps(1.0f, 0.0f, 0.0f, 0.0f);
__m128 quat2 = _mm_set_ps(0.0f, 1.0f, 0.0f, 0.0f);
int result = _mm_comilt_ps(quat1, quat2);

intrinsics

intrinsics 是编译器提供的特殊函数。这些函数允许开发者直接访问处理器的指令集。intrinsics 可以用于编写高效的 simd 代码。例如,以下代码使用 intrinsics 来计算两个向量的点积:

float dot_product(float* vec1, float*