无符号 32 位整数的水平最小值和 SSE 中的位置

2024-02-19

我正在寻找一种方法来查找无符号 32 位整数的最小值及其在 SSE 中的位置(类似于 _mm_minpos_epu16)。我知道我可以通过一系列 _mm_min_epu32 和洗牌/移位找到最小值,但这并不能让我找到位置。

有人有任何很酷的方法吗?


一般来说,如果将水平运算符与 SIMD 一起使用,则表明 SIMD 没有得到最佳使用。然而,水平操作在循环结束时很好,在这种情况下我会这样做

int result[4] __attribute__((aligned(16)));
_mm_store_si128((__m128i *) result, v);
for(int i=0; i<4; i++) if(result[i]<min) { min = result[i]; index = i; }

不过,这里有一些使用 SSE 的解决方案。我不知道它们是否比上面的代码更好。

第一个解决方案是 Paul R 答案的变体。

vmin = _mm_min_epu32(vmin, _mm_alignr_epi8(vmin, vmin, 4));
vmin = _mm_min_epu32(vmin, _mm_alignr_epi8(vmin, vmin, 8));
__m128i vmask = _mm_cmpeq_epi32(v, vmin);
vmask = _mm_xor_si128(vmask, _mm_set1_epi32(-1));
__m128i vpos = _mm_minpos_epu16(vmask);

vpos 中的第二个 16 位字包含两倍的位置。

这是另一种使用的变体_mm_minpos_epu16。它首先找到最小的高 16 位,然后屏蔽掉不在最小 16 位中的值(通过将它们全部设置为高),然后找到低 16 位的最小值以及位置。

__m128i mask1 = _mm_setr_epi8(0x0,0x1,0x4,0x5, 0x8,0x9,0xc,0xd, 0x0,0x1,0x4,0x5,  0x8,0x9,0xc,0xd);
__m128i mask2 = _mm_setr_epi8(0x2,0x3,0x6,0x7, 0xa,0xb,0xe,0xf, 0x2,0x3,0x6,0x7,  0xa,0xb,0xe,0xf);
__m128i mask3 = _mm_set1_epi32(0x01000100);

掩码是恒定的,因此可以在编译时或循环外计算它们。

__m128i lo = _mm_shuffle_epi8(v,mask1);            //lower 16-bits
__m128i hi = _mm_shuffle_epi8(v,mask2);            //upper 16-bits
__m128i t1 = _mm_minpos_epu16(hi);                 //upper 16-bits min
__m128i t2 = _mm_shuffle_epi8(t1, mask3);          //broadcast upper min
__m128i t3 = _mm_cmpeq_epi32(t2,hi);               //select equal
__m128i t4 = _mm_xor_si128(t3, _mm_set1_epi32(-1));//invert
__m128i t5 = _mm_or_si128(lo,t4);                   
__m128i t6 = _mm_minpos_epu16(t5);                 //lower 16-bits hi and position

最小值的高 16 位位于前 16 位中t1最小值的低 16 位位于前 16 位中t6。该位置位于第二个 16 位t6.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无符号 32 位整数的水平最小值和 SSE 中的位置 的相关文章

  • PhoneGap 1.4 封装 Sencha Touch 2.X - 性能怎么样?

    我正在构建一个多平台平板电脑应用程序 仅使用其 Webview 使用 Phonegap 1 4 对其进行包装 然后使用 Sencha Touch 2 框架发挥我的魔力 我所说的多平台是指 iOS 5 X 和 Android 3 0 目前 到
  • Python——捕获异常的效率[重复]

    这个问题在这里已经有答案了 可能的重复 Python 常见问题解答 异常有多快 https stackoverflow com questions 8107695 python faq how fast are exceptions 我记得
  • 在常数空间中创建 1..N 的随机排列

    我正在寻找枚举固定空间中数字 1 N 的随机排列 这意味着我无法将所有数字存储在列表中 原因是 N 可能非常大 超过可用内存 我仍然希望能够一次遍历这样一个数字的排列 只访问每个数字一次 我知道对于某些 N 可以这样做 许多随机数生成器随机
  • 即使在急切加载之后,belongs_to 关联也会单独加载

    我有以下关联 class Picture lt ActiveRecord Base belongs to user end class User lt ActiveRecord Base has many pictures end 在我的
  • 找到一条穿过任意节点序列的最短路径?

    In 这个先前的问题 https stackoverflow com questions 7314333 find shortest path from vertex u to v passing through a vertex wOP询
  • IIS7 上的 ASP.NET 应用程序 - iisreset 后启动速度非常慢

    我有一个在 Windows 2008 上的 IIS7 下运行的 ASP NET 3 5 网站 当我重新启动 IIS iisreset 然后点击一个页面时 初始启动非常慢 我在 Process Explorer 中看到以下活动 w3wp ex
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • 具有 2 个属性的背包算法。如何在 3d 数组中实现它?

    当有超过 1 个属性时 我无法理解背包问题 当有 1 个属性时 我必须编写一个使用具有 2 个属性的背包算法的程序 老师告诉我们 它必须在 3d 数组中完成 错误的实现将导致 O 2 n 处理时间 我无法想象这样的数组会是什么样子 假设这是
  • 如何最大限度地提高服务器性能?

    我一直在努力了解性能和可扩展性 并想知道开发人员 系统管理员正在做什么来提高他们的系统的效率 为了标准化答案 如果您能尽力回答以下任一问题 将会有所帮助 Profile Magazine publication on Joomla Jobs
  • 迭代列表的奇怪速度差异

    我创建了两个重复两个不同值的长列表 在第一个列表中 值交替出现 在第二个列表中 一个值出现在另一个值之前 a1 object object 10 6 a2 a1 2 a1 1 2 然后我迭代它们 不对它们执行任何操作 for in a1 p
  • 红宝石接球和效率

    catch在 Ruby 中意味着跳出深度嵌套的代码 在 Java 中 例如用Java也可以达到同样的效果try catch用于处理异常 但它被认为是糟糕的解决方案 而且效率非常低 在 Ruby 中 我们有处理异常的方法begin raise
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • python 日志记录会刷新每个日志吗?

    当我使用标准模块将日志写入文件时logging 每个日志会分别刷新到磁盘吗 例如 下面的代码会将日志刷新 10 次吗 logging basicConfig level logging DEBUG filename debug log fo
  • 举例解释bpe(字节对编码)?

    有人可以帮忙解释一下背后的基本概念吗BPE模型 除了这张纸 https arxiv org abs 1508 07909 目前还没有那么多解释 到目前为止我所知道的是 它通过将罕见和未知的单词编码为子词单元序列来实现开放词汇表上的 NMT
  • 这个方法比 Math.random() 更快吗?

    我是一名初学者 目前已经开始开发一款使用粒子群优化算法的 Android 游戏 我现在正在尝试稍微优化我的代码 并且 for 循环中有相当多的 Math random 几乎一直在运行 所以我正在考虑一种方法来绕过并跳过所有 Math ran
  • Java递归方法求阶乘返回负输出[重复]

    这个问题在这里已经有答案了 我知道这是溢出 但问题是 20 是相对较小的数字 这不应该发生 对吧 有没有更好的方法来查找大数 例如 1000 的阶乘 而不会得到这种奇怪的结果 public class RecursiveFunctionsE
  • R、Rcpp 与 Armadillo 中矩阵 rowSums() 与 colSums() 的效率

    背景 来自 R 编程 我正在扩展到 C C 形式的编译代码Rcpp 作为循环交换 以及一般的 C C 效果的实践练习 我实现了 R 的等效项rowSums and colSums 矩阵的函数Rcpp 我知道它们以 Rcpp 糖的形式存在 并
  • 二维滑动窗口最小值/最大值

    假设我们得到一个大小为 NxN 的像素整数矩阵和一个整数 k 窗口大小 我们需要使用滑动窗口找到矩阵中的所有局部最大值 或最小值 这意味着 如果某个像素与其周围窗口中的所有像素相比具有最小 最大 值 则应将其标记为最小 最大 有一种著名的滑
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk

随机推荐

  • C# 中 var 和 string 有什么区别? [复制]

    这个问题在这里已经有答案了 有什么区别var and string in C 关键词var用于隐式类型的声明 如果您使用变量的命名类型 那么除了可读性之外没有其他区别 并且对于哪种更好有不同的意见 例子 var s asdf 给出与以下完全
  • MCP23017 I2C 设备驱动程序探测函数未调用

    我正在使用以下 I2C GPIO设备驱动 https github com torvalds linux blob master drivers gpio gpio mcp23s08 c访问 MCP23017 GPIO 使用 insmod
  • 在 Sphinx 中的文件链接中使用版本号

    在 Sphinx 中 可以使用以下语法生成文件链接 name of file js
  • ImportError:动态模块未定义 init 函数 (initfizzbuzz)

    我尝试编译fizzbuzz c 以便通过 python 导入它 用于建筑fizzbuzz c I used python setup py build ext i 构建后 我尝试导入fizzbuzz c但出现了下面的错误 我怎么解决这个问题
  • Prolog 中的递归乘法

    序言新手 编辑 使用 swi prolog 我想递归地执行乘法方法在序言中已经执行的操作 而不实际使用乘法方法 我想要实现的算法看起来像 multn N1 N2 output if n2 lt 0 return output else mu
  • Ruby 和 Ruby on Rails 之间有什么区别?

    这几天我一直在研究 Ruby 我注意到有 Ruby on Rails 两者有什么区别 他们一起工作吗 语法一样吗 Ruby 是一种编程语言 Ruby on Rails RoR 是一个用 Ruby 实现的 Web 应用程序框架 因此 它们不仅
  • 使用 SQL 后端时维护表单中的自动编号功能

    目前 我正在尝试将数据库从 Access 后端迁移到 SQL 后端 同时仍保留 Access 表单作为前端 这是通过带有 ODBC 连接到我的后端的链接表来完成的 该表单旨在向表中添加新记录 问题出在自动编号上 ID 设置为自动编号 并且在
  • Appium - 在 PageFactory 获取 java.lang.RuntimeException:java.lang.NoSuchMethodException:jdk.proxy2.$Proxy9.proxyClassLookup()

    我在运行 Appium 测试时遇到此异常 PageFactory 上的测试失败 但出现以下异常 My POM
  • ggplot2:使用循环在一页上打印多个绘图

    我有几个主题需要生成一个绘图 因为我有很多主题 我希望在一页上有多个绘图 而不是一个主题图 这是我到目前为止所做的 读取带有主题名称的txt文件 subjs lt scan ListSubjs txt what 创建一个列表来保存绘图对象
  • 膨胀类 android.support.v7.widget.RecyclerView 时出错

    我正在尝试在现有项目中使用 RecyclerView 构建时没有错误 但在膨胀时没有发现 RecyclerView 的类错误 看不到我做错了什么 感谢您的帮助 activity main xml
  • 使用 Paperclip 和 Amazon s3 上传照片时缺少凭据

    我在使用 Paperclip 将照片上传到 S3 时遇到问题 照片正确下载到网站 但尝试上传新照片时会出现 凭据丢失 消息 我尝试重置 S3 密钥 尝试更改编码中变量的访问权限 但没有成功 我几乎可以肯定这是照片问题 因为如果我提交没有照片
  • 使用 jquery 延迟对象链接多个 ajax 调用

    在寻找类似于此处描述的解决方案时 如何使用 jquery 链接 ajax 调用 https stackoverflow com questions 8612894 how to chain ajax calls using jquery l
  • 覆盖CSS属性全部:未设置

    对于我正在开发的 CSS 框架 我正在使用all unset 它本身工作得很好 foo all unset 但是 在某些情况下 我想 撤消 此规则的效果 如 foo hover all auto 然而 这显然行不通 因为没有值auto fo
  • Git 工作流程最佳实践

    愚蠢的问题 把我当作版本控制的完全新手 我是 Git 新手 我以前使用过 subversion 但只是基础知识 我了解 Git 及其分支命令的基础知识 我有一个想象的情况需要您的建议 假设我的软件当前版本是 v1 2 稳定且已发布 My S
  • 在 Visual Studio Code 中运行 python 脚本;如何让“input()”工作?

    我试图抓住一个简单的input using input 但是当我在其中运行脚本时视觉代码每当该行代码被执行时 程序就会挂起 我如何在其中运行代码视觉工作室代码并使用input task version 0 1 0 command pytho
  • 键入时禁用 Visual Studio Code 中的 linting

    前提 当我使用 Visual Studio Code 时 我希望在保存时进行 linting 并且我喜欢智能感知 尽管如此 我对 linting 感到非常恼火 又名错误和警告消息 形式为 ts jshint 这里你缺少一个分号 当我打字的时
  • EF 4.1 Code First 的复合密钥

    我试图弄清楚如何使用 EF code First 4 1 RC 拥有复合密钥 目前 我正在使用 Key 数据注释 但我无法指定多个键 如何指定复合键 这是我的例子 public class ActivityType Key public i
  • java.util.Scanner 读取剩余内容

    Using a java util Scanner例如 它是否可以返回所有剩余内容 我的情况是 一旦我阅读了一个中的多个字段String 我只想得到剩下的东西并将其存储在其他地方 例如我的内容可能包括 1 2 Some Garbage wi
  • Intellij IDEA 正则表达式字符类不能在字符范围内使用

    IDEA 不允许出现此错误 并且我无法找到关闭此类错误的选项 有谁知道如何修复错误或关闭警告 javascript 工作正常 只有 IDEA 认为这是一个问题 您正在使用以下命令创建一个范围连字符 在你的角色课程中 您应该将其移至任一端 另
  • 无符号 32 位整数的水平最小值和 SSE 中的位置

    我正在寻找一种方法来查找无符号 32 位整数的最小值及其在 SSE 中的位置 类似于 mm minpos epu16 我知道我可以通过一系列 mm min epu32 和洗牌 移位找到最小值 但这并不能让我找到位置 有人有任何很酷的方法吗