simd相关内容

可以使用输入寄存器寻址输出 SIMD 寄存器

是否可以使用输入向量的标量值来索引输出向量?我尝试在 SIMD 中实现以下功能,但找不到任何解决方案. void shuffle(unsigned char * a,//输入一个unsigned char * r){//输出 r对于 (i=0; i 输入/输出向量示例如下 unsigned char * a = {0, 0, 0, 10, 0, 0, 0, 2, 0, 0, 0, 0, ..
发布时间:2021-08-27 19:47:30 C/C++开发

为什么我的 SSE 代码比本地 C++ 代码慢?

首先,我是 SSE 的新手.我决定加速我的代码,但它似乎比我的本机代码运行得更慢. 这是一个计算平方和的例子.在我的 Intel i7-6700HQ 上,本机代码需要 0.43 秒,SSE 需要 0.52.那么,瓶颈在哪里? inline float squared_sum(const float x, const float y){返回 x * x + y * y;}#define US ..
发布时间:2021-08-27 19:47:25 C/C++开发

是否可以使用 SSE 对嵌套进行矢量化?

我从来没有为 SSE 优化编写过汇编代码,如果这是一个菜鸟问题,很抱歉.在 this 中解释了如何矢量化 for 带有条件语句.但是,我的代码(取自 here )的形式如下: for (int j=-halfHeight; j(y,x) + wx * im.at(y,x+1)) +(wy) * ((1.0f - wx) * im.at(y+1,x) + wx * im.at(y+1,x+1)) ..
发布时间:2021-08-27 19:47:11 C/C++开发

我需要在 2021 年使用 _mm256_zeroupper 吗?

摘自 Agner Fog 的“用 C++ 优化软件": 在某些 Intel 上混合使用和不使用 AVX 支持编译的代码时出现问题处理器.从 AVX 代码到非 AVX 代码会导致性能下降因为 YMM 寄存器状态发生了变化.应该通过调用来避免这种惩罚从 AVX 代码到非 AVX 代码的任何转换之前的内在函数 _mm256_zeroupper().在以下情况下,这可能是必要的: • 如果程序 ..
发布时间:2021-08-27 19:47:05 C/C++开发

使用 sse 内在函数时如何中断循环?

__m128* pSrc1 = (__m128*) 字符串;__m128 m0 = _mm_set_ps1(0);//空字符同时(1){__m128 结果 = __m128 _mm_cmpeq_ss(*pSrc1, m0);//如果字符是\0则中断//在这里做一些事情pSrc1++;} 我有一个字符串,其长度可以是 16 的倍数.如果 _mm_cmpeq_ss 返回相等,我该如何跳出循环? ..
发布时间:2021-08-27 19:46:58 其他开发

SIMD:位包有符号整数

无符号整数可以通过使用“位打包"进行压缩技术:在无符号整数块内仅存储有效位,当块中的所有整数都为“小"时导致数据压缩.该方法称为 FOR(参考框架). 有 SIMD 库可以非常有效地执行此操作. 现在我想使用类似 FOR 的技术来编码 signed 整数,例如来自未排序的无符号整数的差分序列.每个有符号整数的符号都需要存储在某处,有两种选择: 将标志存储在单独的数据块中.这会增加 ..
发布时间:2021-08-27 19:46:55 其他开发

SSE:如何将 _m128i._i32[4] 减少到 _m128i._i8

我对 SSE 非常陌生 - 编码:我想将 int32 类型的 _m128i[4] 的结果存储到一个 int8 类型的 _m128i.(_m128i[j]._i32[k] 的值都在 (-127 和 + 127 ) 之间 我认为伪代码如下: result._i8 = {vec1._i8[0], vec1._i8[4], vec1._i8[8], vec1._i8[12],vec2._i8[0 ..
发布时间:2021-08-27 19:46:31 C/C++开发

使用 SIMD 解交织半字节向量

我有一个由 16384 个带符号的四位整数组成的输入向量.它们被打包成 8192 字节.我需要交错这些值并将其解压缩为两个单独数组中的有符号 8 位整数. a,b,c,d 是 4 位值. A、B、C、D 是 8 位值. 输入 = [ab,cd,...] Out_1 = [A,C, ...] Out_2 = [B,D, ...] 我可以很容易地用 C++ 做到这一点. co ..
发布时间:2021-08-27 19:46:25 C/C++开发

在 SIMD 操作的上下文中,非打包指令和打包指令有什么区别?

在 SIMD 操作的上下文中,非压缩指令和压缩指令有什么区别? 我正在阅读一篇关于优化 SSE 代码的文章: http://www.cortstratton.org/articles/OptimizingForSSE.php#batch 当我阅读时出现了这个问题 “作为一个额外的好处,movss 是一个非打包指令,它使我们能够更好地利用并行指令解码器.." 那有什么区 ..
发布时间:2021-08-27 19:46:22 其他开发

SIMD 行列式计算

是否存在一种计算低维(约 4)矩阵行列式的方法,该方法适用于 SIMD(霓虹灯、SSE、SSE2)?我正在使用手动膨胀公式,但效果不佳.我在 linux 下一直使用 SSE 到 SSE3 和霓虹灯.矩阵元素都是浮点数. 解决方案 这是我的 5 美分. 2x2 矩阵的行列式: 这是给读者的练习,应该很容易实现 3x3 矩阵的行列式: 使用标量三重积.这将需要智能的 c ..
发布时间:2021-08-27 19:46:19 其他开发

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

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

从 __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 其他开发

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

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

如何在sse2上模拟pcmpgtq?

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

尝试在 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++开发