AR 开发中常见的 simd 函数大盘点
2023-09-11 05:34:33
概述
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*