SSE:如果不为零则倒数

2023-12-27

如何使用 SSE 指令取浮点数的倒数(逆),但是仅适用于非零 values?

背景如下:

我想规范化向量数组,以便每个维度具有相同的平均值。在 C 中,可以将其编码为:

float vectors[num * dim]; // input data

// step 1. compute the sum on each dimension
float norm[dim];
memset(norm, 0, dim * sizeof(float));
for(int i = 0; i < num; i++) for(int j = 0; j < dims; j++)
    norm[j] += vectors[i * dims + j];
// step 2. convert sums to reciprocal of average
for(int j = 0; j < dims; j++) if(norm[j]) norm[j] = float(num) / norm[j];
// step 3. normalize the data
for(int i = 0; i < num; i++) for(int j = 0; j < dims; j++)
    vectors[i * dims + j] *= norm[j];

现在出于性能原因,我想使用 SSE 本质来完成此操作。 Setp 1 和步骤 3 很简单,但我被困在步骤 2 上。我似乎没有找到任何代码示例或明显的 SSE 指令来取值的倒数if它不为零。 对于除法,_mm_rcp_ps 可以解决这个问题,并且可能将其与条件移动结合起来,但是如何获得指示哪个分量为零的掩码?

我不需要上述算法的代码,只需要“如果不为零则逆”函数:

__m128 rcp_nz_ps(__m128 input) {
    // ????
}

Thanks!


__m128 rcp_nz_ps(__m128 input) {
    __m128 mask = _mm_cmpeq_ps(_mm_set1_ps(0.0), input);
    __m128 recip = _mm_rcp_ps(input);
    return _mm_andnot_ps(mask, recip);
}

每条车道mask设置为b111...11如果输入为零,并且b000...00否则。 And-not 使用该掩码将与零输入相对应的倒数元素替换为零。

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

SSE:如果不为零则倒数 的相关文章

  • 为什么相同的代码在同一台计算机上的执行时间可能不同?

    我是 C 编程新手 我编写了代码并希望获得它的运行时 这就是我所做的 每次运行代码时 我都会得到不同的运行时值 这样对吗 或者我的代码有问题吗 int main int argc char argv time t start end sta
  • 如何在 Visual Studio 2010 中增强 XAML 设计器?

    当我使用 XAML 设计器时 进入设计器和退出设计器是如此困难和缓慢 当我这样做时 Visual Studio 卡了一段时间 有什么方法可以增强 XAML 设计器和编辑器吗 Ant 保存 XAML 文件时非常慢 这通常意味着您可能有复杂的
  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • 在 repl.it 上运行discord.py bot时如何解决“429:太多请求”?

    我的代码 见下文 运行良好 但随后弹出此错误并且不会消失 http py line 293 in static login data await self request Route GET users me File opt virtua
  • 通过ajax将当前页面html发送回服务器

    在我的应用程序中 我通过 jquery ajax 将网页的 html 发送回服务器 因为我需要在服务器中存储此页面的副本 代码如下 document ready function var pcontent document body inn
  • 如何使用自定义文档根在 Apache 2.4 中显示目录索引

    我在 Ubuntu 13 10 中的 Apache 2 4 中遇到问题 我尝试将文档根目录更改为 home fandi public html 一切工作正常 但我尝试在 public html 中创建文件夹 但收到如下错误 Sat Jan
  • 这个 Coldfusion 查询 SQL 注入证明吗?

    通常 我在应用程序中使用整数 id 但对于这个开发 我正在文本字段 标签名称 上进行查找 我确实使用了 cfqueryparam 但考虑到它是一个文本字段 它是否容易受到 SQL 注入攻击 如果是这样 除了繁琐地搜索 SQL 命令的字符串之
  • 我可以使用layout_weight来定位RelativeLayout吗?

    我一整天都在努力让它发挥作用 我想我可以使用RelativeLayout android layout weight 0 3 将三个按钮放置在屏幕右侧 不居中 而是距顶部向下 30 这可能吗 如果可以我该怎么做 以下是我的 XML 其中显示
  • 允许的内存大小 php.ini

    我有一个 Symfony 4 应用程序 我上传文件有 2MB 限制 这个限制有效 在开发环境中一切正常 图像上传得很好 但在产品中 我总是收到相同的消息 Fatal error Allowed memory size of 13421772
  • 泛型函数类型中的通用量化

    正在阅读paper http lucacardelli name Papers OnUnderstanding A4 pdf关于编程语言中的类型和多态性 我想知道是否可以用 Scala 表达类型成员上类似的通用量化 论文中的示例 type
  • 如何使用 Postgres 和 Tomcat7 JDBC Pool 配置PreparedStatement 缓存?

    我将 Tomcat7 与 Postgres 9 1 结合使用 将 JPA 与 Hibernate 结合使用 并且我想配置准备好的语句池 我通过查看 postgres 查询日志看到的正常默认行为是看到许多 PARSE BIND 对同一查询执行
  • 在 NanoHTTPD 中检索 HTTP 正文

    如何检索 HTTPPOST实施时请求主体纳米HTTPD http nanohttpd coms serve method 我尝试过使用getInputStream 的方法IHTTPSession已经 但我总是得到一个SocketTimeou
  • 如何模拟cmd-shift-4截屏界面?

    我正在构建一个 OSX 应用程序 并希望使用与 cmd shift 4 UX IE 启动操作类似的界面来捕获屏幕的一部分 呈现一个鼠标光标 mouseDown 并拖动 mouseUp 捕获屏幕坐标 同时绘制半透明覆盖层以表示正在捕获的区域
  • 每 n 个添加类

    我有一个元素列表 我想用 3 种不同的方式设置它们的样式 我希望每个第三个列表项在整个列表中都具有相同的类 例如 li class A Some Content li li class B Some Content li li class
  • 具有特定范围的 angularjs 部分模板

    我想在主模板中包含一个部分模板 但在调用部分模板时具有特定的范围 例如 这是我的主模板 非常简化 实际模板更复杂 所以这里不能使用 ng iterate h1 title my item1 name is item1 name h1 div
  • 如何在 JBoss 中配置 ActiveMQ JCA 连接器以使用 XA 连接?

    在 JBoss 5 1 0 上 我使用 ds xml 标准 jboss DS 配置了数据源 PostgreSQL 8 3 11 它使用 XADataSource PGXA数据源 http jdbc postgresql org develo
  • 我正在尝试编写一段 Javascript 以定时间隔在两个视频之间切换 不要问 更糟糕的是 每个视频都必须从特定位置开始 大约十秒 再次强调 不要问 我通过使用 YUI 异步库来定期切换视频来了解基础知识 YUI use async que
  • 无法启动服务? (语音识别)

    我想在服务中使用 pocketsphinx 连续收听 hello 这个词 我得到了错误 这里是完整的堆栈跟踪 https gist github com anonymous d68e9ac7e5d98315a5a4 这是其中的一小部分 Un
  • 如何判断文档是否为模板?

    我试图确定文档是简单文档 doc docx docm 还是模板 dot dotx dotm 我知道有多种方法可以解决这个问题 例如检查文件扩展名 但我正在寻找最 安全 的一种 我目前的猜测是 Private Function isTempl
  • 错误是:没有名为 postgresql.base 的模块

    我正在尝试将 Django 应用程序迁移到 postgresql 但我无法让 Django 识别出实际安装了 postgres 我已经将它安装在我的计算机上 并且它在我的计算机上运行良好 但是当我尝试将其设置为我的默认值时settings
  • 领域从必需变量迁移到可空变量

    领域从必需变量迁移到可空变量 我有一个变量 它是我以前版本的领域中的必需字段 但对于较新的版本 我希望它不是必需的 而是可以为空的 我如何通过领域迁移来做到这一点 您可以检查示例迁移示例 https github com realm rea
  • Java 和 C++ 在对象创建方面的主要区别是什么?

    我正在准备 Java 考试 之前考试的问题之一是 Java 和 C 在对象创建方面的主要区别是什么 我想我知道对象创建的基础知识 例如如何调用构造函数 初始化块在 Java 中做什么 以及当一个类的构造函数调用另一个尚未构造的类的方法时会发
  • SSE:如果不为零则倒数

    如何使用 SSE 指令取浮点数的倒数 逆 但是仅适用于非零 values 背景如下 我想规范化向量数组 以便每个维度具有相同的平均值 在 C 中 可以将其编码为 float vectors num dim input data step 1