sse相关内容

__mm128 的向量不会 push_back()

这个简单的 SSE 代码: #include #include int main() {std::vector等等;blah.push_back(__m128());} 在 MSVC 10 上崩溃,0xffffffff 出现段错误. 可能出了什么问题? 解决方案 std::vector 不分配特殊对齐的内存,__m128 需要存储它的数据.您将不得不换出分配器,或者用 4 个浮点 ..
发布时间:2021-08-27 19:46:03 C/C++开发

将数据放入 SIMD 寄存器需要多少个周期?

我是一名学习 x86 和 ARM 架构的学生. 我想知道将多个数据放入 SIMD 寄存器需要多少个周期? 我知道 x86 SSE 的 xmms 寄存器有 128 位大小的寄存器. 如果我想通过 SIMD 指令集和汇编语言将 8 位数据中的 32 个放入堆栈中的一个 xmms 寄存器,该怎么办, 通用寄存器的 PUSH/POP 是否具有相同的周期时间? 还是每 8 位数 ..
发布时间:2021-08-27 19:46:01 其他开发

使用 sse 内在函数对 (A)RGB32 图像进行最快 50% 缩放

我想在 C++ 中尽可能快地缩小图像.本文描述了如何有效地将 32 位 rgb 图像平均降低 50%.它很快,看起来不错. 我尝试使用 sse 内在函数修改该方法.无论是否启用 SSE,下面的代码都有效.然而,令人惊讶的是,加速可以忽略不计. 谁能看到改进 SSE 代码的方法.创建 vars shuffle1 和 shuffle2 的两行似乎是候选者(使用一些巧妙的移位或类似方法). ..
发布时间:2021-08-27 19:45:58 C/C++开发

SSE指令:字节+短

我有很长的字节数组,需要将它们添加到 short(或 int)类型的目标数组中.这样的SSE指令存在吗?或者他们的套餐? 解决方案 您需要将每个 8 位值的向量解包为两个 16 位值的向量,然后将它们相加. __m128i v = _mm_set_epi8(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);__m128i vl = ..
发布时间:2021-08-27 19:45:55 其他开发

从 __m128i 中查找最小值/最大值

我想使用 SIMD 操作在字节数组中找到最小值/最大值.到目前为止,我已经能够遍历数组并将最小值/最大值存储到 __m128i 变量中,但这意味着我正在寻找的值混合了其他值(准确地说是其他 15 个). 我在这里和此处 用于整数,此页面 用于浮动,但我不明白 _mm_shuffle* 是如何工作的.所以我的问题是: 为了从 __m128i 变量中提取最小/最大字节(或无符号字节)值,我 ..
发布时间:2021-08-27 19:45:52 C/C++开发

最佳 SSE 无符号 8 位比较

我试图找到使用 SSE(最高可达 SSE 4.2)执行 8 位无符号比较的最有效方法. 我正在处理的最常见的情况是比较 > 0U,例如 _mm_cmpgt_epu8(v, _mm_setzero_si128())//#1 (当然也可以认为是对非零的简单测试.) 但我也对更一般的情况感兴趣,例如 _mm_cmpgt_epu8(v1, v2)//#2 第一种情况可以用 2 条指令实 ..
发布时间:2021-08-27 19:45:49 其他开发

使用 sse 指令复杂的 Mul 和 Div

通过 SSE 指令执行复杂的乘法和除法是否有益?我知道使用 SSE 时加法和减法效果更好.有人能告诉我如何使用 SSE 执行复杂的乘法以获得更好的性能吗? 解决方案 出于完整性考虑,可以下载英特尔® 64 位和 IA-32 架构优化参考手册此处 包含用于复数乘法的程序集(例 6-9)和复除法(例 6-10). 例如乘法代码: //(ak + i bk ) * (ck + i dk ..
发布时间:2021-08-27 19:45:46 其他开发

SIMD 以下代码

如何在 C 中对以下代码进行 SIMIDize(当然使用 SIMD 内在函数)?我在理解 SIMD 内在函数时遇到问题,这会很有帮助: int sum_naive( int n, int *a ){整数总和 = 0;for( int i = 0; i 解决方案 这是一个相当简单的实现(警告:未经测试的代码): int32_t sum_array(const int32_t a[], co ..
发布时间:2021-08-27 19:45:43 其他开发

MMX 和 XMM 寄存器的区别?

我目前正在学习英特尔 x86 处理器上的汇编编程. 谁能给我解释一下,MMX和XMM寄存器有什么区别?我很困惑它们提供什么功能以及它们之间的异同? 解决方案 MM 寄存器是 MMX 指令集使用的寄存器,第一次尝试添加(仅限整数)SIMD 到 x86.它们是 64 位宽,它们实际上是 x87 寄存器尾数部分的别名(但它们不受 FPU 栈顶位置的影响);这样做是为了保持与现有操作系统的兼 ..
发布时间:2021-08-27 19:45:40 其他开发

如何将无符号整数加载到 SIMD 中

我有一个 C 程序,其中有几个无符号整数数组.我正在使用这个声明 uint32_t. 我想使用 SIMD 对存储在每个数组中的数据执行一些操作.这就是我被卡住的地方,因为看起来大多数 SSE 和 SSE2 函数只支持 float 和 double. 我加载 uint32_t 类型数据的最佳方式是什么? 解决方案 对于通常使用的任何整数 SSE 类型_mm_load_si128/ ..
发布时间:2021-08-27 19:45:35 其他开发

AT&T 语法如何处理其他助记符和操作数大小后缀之间的歧义?

在 AT&T 语法中,指令通常必须以适当的操作数大小作为后缀,q 用于对 64 位操作数进行操作.然而,在 MMX 和 SSE 中也有 movq 指令,q 是原始的 Intel 助记符,而不是额外的后缀. 那么这将如何在 AT&T 中表示?是否需要另一个 q 后缀,如 movqq %mm1, %mm0movqq %xmm1, %xmm0 要不要? 如果还有其他以 AT&T 后缀结尾 ..
发布时间:2021-08-27 19:45:29 其他开发

将 xmm 寄存器的低两个 32 位浮点数扩展为整个 xmm 寄存器

在 Intel x86 汇编中执行以下操作的最有效方法是什么(a、b 是 32 位浮点数): 从 xmm1: [-, -, a, b] 到 xmm1: [a, a, b, b] 我找不到任何有用的说明. 我的想法是将 a 和 b 复制到其他寄存器,然后将 xmm1 寄存器移动 4 个字节并移动 a或 b 到最低 4 个字节. 解决方案 您正在寻找 unpcklps xmm1, ..
发布时间:2021-08-27 19:45:26 其他开发

如何在sse2上模拟pcmpgtq?

PCMPGTQ 是在 sse4.2 中引入的,它为产生掩码的 64 位数字提供大于符号的比较. 如何在早于 sse4.2 的指令集上支持此功能? 更新:同样的问题适用于带有 Neon 的 ARMv7,它也缺少 64 位比较器.姐妹问题在这里找到:在带有 Neon 的 ARMv7a 上通过 64 位有符号比较支持 CMGT 的最有效方法是什么? 解决方案 __m128i pcmp ..
发布时间:2021-08-27 19:45:23 其他开发

如何将浮点常量值移动到 xmm 寄存器中?

是将值移动到 xmm 寄存器的唯一方法,首先将值移动到整数寄存器,不知道它们叫什么,然后再移动到 xmm 寄存器,例如 mov [eax], (float)1000 ;存储到内存movss xmm1,[eax] ;重新加载 或 mov eax, 1000 ;立即移动整数cvtsi2ss xmm1,eax ;并转换 或者有其他方法吗?有没有办法直接将值移动到 xmm 寄存器中,类似于:mov ..
发布时间:2021-08-27 19:45:21 其他开发

尝试在 SSE 编程中使用和掩码添加 __m128

我正在尝试使用比较操作的结果添加到 SSE 变量.我刚刚意识到,当使用 _mm_cmplt_ps 操作时,如果结果为真,它会返回一个 NAN,因为无法表示 0xffffffff,这对我没有用: __m128 va;__m128 vb;__m128 结果 =_mm_set1_ps(0.0f);vb = _mm_cmplt_ps(va,vb);结果 = _mm_add_ps(result,vb);/ ..
发布时间:2021-08-27 19:45:18 C/C++开发

SSE向量化与内存对齐的关系

为什么我们需要 SSE/AVX 的对齐内存? 我经常得到的答案之一是对齐的内存加载比未对齐的内存加载快得多.那么,为什么这种对齐的内存加载比未对齐的内存加载快得多? 解决方案 这不仅特定于 SSE(甚至 x86).在大多数架构上,加载和存储需要自然对齐,否则它们要么 (a) 生成异常,要么 (b) 需要两个或更多周期加上一些修复,以便透明地处理未对齐的加载/存储.在 x86 (b) ..
发布时间:2021-08-27 19:45:15 其他开发

如何用SSE3实现符号功能?

1) 有没有办法有效地实现签名功能 使用具有以下特征的 SSE3(无 SSE4)? 输入是一个浮点向量__m128. 输出也应该是 __m128 以 [-1.0f, 0.0f, 1.0f] 作为其值 我试过了,但没有用(虽然我认为应该这样做): inputVal = _mm_set_ps(-0.5, 0.5, 0.0, 3.0);comp1 = _mm_cmpgt_ps(_mm_s ..
发布时间:2021-08-27 19:45:12 其他开发

如何反转 __m128 类型变量?

我知道这应该是一个谷歌搜索问题,但我就是找不到答案. 假设我有一个__m128变量a,其内容为a[0],a[1]、a[2]、a[3].是否有单个函数可以将其反转为a[3]、a[2]、a[1], a[0]? 解决方案 使用 _mm_shuffle_ps().该指令已在 SSE 中可用,通过组合来自两个输入向量中的每一个的两个任意 32 位分量,可以在单个向量中收集 4 个 32 位分量 ..
发布时间:2021-08-27 19:45:09 C/C++开发

如何否定(更改符号)__m128 类型变量中的浮点元素?

是否有任何单个指令或函数可以反转 __m128 中每个浮点数的符号?即 a = r0:r1:r2:r3 ===>a = -r0:-r1:-r2:-r3? 我知道这可以通过 _mm_sub_ps(_mm_set1_ps(0.0),a) 来完成,但是因为 _mm_set1_ps(0.0) 是一个多指令功能? 解决方案 在实践中,您的编译器应该很好地生成 0.0.0 的常量向量.它可能只会 ..
发布时间:2021-08-27 19:45:06 其他开发