如何在 AVX 或 SSE 指令中进行间接加载(聚集-分散)?

2023-11-25

我已经搜索了一段时间,但似乎在文档或 SO 中找不到任何有用的东西。这个问题并没有真正帮助我,因为它引用了修改程序集,而我正在用 C 编写。

我有一些代码进行间接访问,我想对其进行矢量化。

for (i = 0; i < LENGTH; ++i) {
   foo[bar[i]] *= 2;
}

因为我有索引,所以我想在里面加倍bar,我想知道是否有办法加载这些索引foo到向量寄存器中,然后我可以应用我的数学并将其存储回相同的索引。

像下面这样的东西。这load and store我刚刚编写的说明,因为我在 AVX 或 SSE 文档中找不到类似的内容。我想我在某处读到过 AVX2 具有类似的功能,但我正在使用的处理器不支持 AVX2。

for (i = 0; i < LENGTH; i += 8) {
   // For simplicity, I'm leaving out any pointer type casting
   __m256 ymm0 = _mm256_load_indirect(bar+i);
   __m256 ymm1 = _mm256_set1_epi32(2); // Set up vector of just 2's
   __m256 ymm2 = _mm256_mul_ps(ymm0, ymm1);
   _mm256_store_indirect(ymm2, bar+i);
}

AVX 或 SSE 中是否有任何指令允许我使用来自不同数组的索引数组加载向量寄存器?或者如果没有显式函数,有什么“hacky”方法可以解决它吗?


(我写了这个老问题的答案,因为我认为这可能对其他人有帮助。)

简短回答

否。SSE 和 AVX 指令集中没有分散/聚集指令。

更长的答案

分散/聚集指令的实现成本很高(就复杂性和芯片面积而言),因为分散/聚集机制需要与高速缓存存储器控制器紧密交织。我相信这就是 SSE/AVX 缺少此功能的原因。

对于较新的指令集,情况有所不同。在AVX2你有

  • VGATHERDPD、VGATHERDPS、VGATHERQPD、VGATHERQPS对于浮点聚集(这里的内在函数)
  • VPGATHERDD、VPGATHERQD、VPGATHERDQ、VPGATHERQQ对于整数聚集(这里的内在函数)

In AVX-512 we got

  • VSCATTERDPD、VSCATTERDPS、VSCATTERQPD、VSCATTERQPS对于浮点分散 (这里的内在函数)
  • VPSCATTERDD、VPSCATTERQD、VPSCATTERDQ、VPSCATTERQQ对于整数散布 (这里的内在函数)

然而,使用分散/聚集进行如此简单的操作是否真正有效仍然是一个问题。

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

如何在 AVX 或 SSE 指令中进行间接加载(聚集-分散)? 的相关文章

随机推荐

  • 如何记住哪个扩展 ${var%} ${var#} 从哪一端起作用? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我很难记住哪一个参数扩展 var subst or var subst 从绳子的前面取下一个 从后面取下一个 例子 var a b c echo dirname var filename
  • 在不规则网格上绘制和着色数据

    我的数据格式为 x y z 其中 x 和 y 不在常规网格上 我希望显示这些数据的 2D 颜色图 并将强度 例如灰度 映射到 z 变量 一个明显的解决方案是在规则网格上进行插值 见下文 d lt data frame x runif 1e3
  • 概括 NumPy 数组中的切片操作

    这个问题是基于this较旧的问题 给定一个数组 In 122 arr np array 1 3 7 4 9 8 arr Out 122 array 1 3 7 4 9 8 并给出其指数 In 127 np indices arr shape
  • CollapsingToolbarLayout 滚动时不起作用(折叠)

    我正在尝试创建一个CollapsingToolbarLayout在它下面是一个列表视图 当列表视图滚动时 工具栏应该折叠 但是当滚动时工具栏不折叠 它不起作用 使用了这个教程 http android developers blogspot
  • java中jar文件的热交换

    我有两个 jar 文件 其中一个 jar 包含启动进程的 main 方法 其他两个 jar 仅包含类文件 在 One jar 中 我在其清单类路径中引用了 Two jar One jar 包含使用 Class forName 动态加载类的机
  • 最快的 Java HashSet 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 此外这个很旧的帖子 我需要一些能够使用原语并为包含大量内容的应用程序提供加速的东西HashSets of Integers Set
  • 设置 jax-ws 客户端超时

    我在设置 jax ws 超时时遇到问题 我的代码是 WebServiceClient name VoipDBJDBCService targetNamespace http db server voipmeter jextreme eu w
  • Crystal Reports 图像和 ASP.Net MVC

    当我使用使用 CrystalImageHandler aspx 的图表和图像时 我在使用 Crystal Reports 时遇到了问题 图像无法显示 我怀疑这是由于 MVC 路由问题造成的 路径图像路径类似这样 src CrystalIma
  • Symfony2/Twig - 迭代选择选项

    常用显示方式select字段是要调用的 form row form doctor service id attr class form control 我想执行两件事 检查该字段是否实际上是一个选择字段 迭代每个选项 值 名称 我知道该怎样
  • React useState setter 内的更新被调用两次

    我正在尝试更新 useState setter 范围内的内容 这正如我在以下 codepen 示例中所期望的那样 更新状态变量之外的值 但正如我的应用程序中所实现的insideCallCount每人都会被叫两次toggleCell称呼 相关
  • Google 字体无法在 Internet Explorer (IE) 11 中运行

    目前正在使用 Google Fonts 构建一个网站 一切都可以在 IE6 到 10 Firefox Chrome 和移动浏览器上运行 然而 在 IE 11 上 不会加载任何字体 并且所有内容都使用后备字体 无衬线字体等 显示 同样的问题似
  • AngularJS:何时使用服务而不是工厂

    请耐心听我说 我知道还有其他答案 例如 AngularJS 服务 提供商 工厂 但是我仍然不知道你什么时候会使用工厂服务 据我所知 工厂通常用于创建可由多个控制器调用的 通用 函数 创建通用控制器功能 Angular 文档似乎更喜欢工厂而不
  • SQL Server 清除内存

    是否可以从 SQL Server 填充的数据中清除 RAM 内存 有什么程序或选项可以做到这一点吗 您可以使用 CHECKPOINT DBCC DROPCLEANBUFFERS to 从内存中删除所有数据页 测试服务器性能很有用 如果查询所
  • 即使机器人是管理员,Discord JS 管理角色权限也丢失

    我的 Discord 机器人没有向使用该命令的用户添加角色 My Code if userCmd toLowerCase prefix verify if message member roles cache find role gt ro
  • 让 Django 1.7 在 Google App Engine 上运行

    任何人都可以帮助向我们指出如何让 Django gt 1 5 在 Google App Engine 上运行的说明吗 我看到很多人声称他们可以使用 Django 1 6 我们希望运行 1 6 或 1 7 我在这里搜索了有关如何设置的说明 到
  • iOS5 UITapRecognizer 用于 UIScrollView 干扰按钮。怎么修?

    我有一堆UIButtons 内UIView在一个UIScrollView 我正在尝试向滚动视图添加点击识别器 点击识别器会触发 但现在我的按钮都不起作用 我知道在iOS5中 UIScrollView可以在完成触摸事件后以某种方式将其传递到控
  • UIImage 的 CGImage 返回 NULL

    我创建了一个将图像分割成多个图像的函数 但是当我获取 UIImage 的 CGImage 时 CGImage 返回 NULL NSArray splitImage UIImage image NSUInteger pieces NSLog
  • 如何从 Core 2 Razor 页面 ViewModel 处理程序返回部分视图

    在 Asp Net MVC 中 您可以通过执行以下操作轻松返回部分视图 return PartialView ModelName Model 这是如何在 RazorPage ViewModel 处理程序上完成的 我明白了这一点 它并不像 M
  • 为什么这里Java运行得比C快呢?

    灵感来自这个问题 Now visible only for users with gt 10k rep 我想出了以下代码 cat loop c int main int argc char argv int i 0 while i lt 2
  • 如何在 AVX 或 SSE 指令中进行间接加载(聚集-分散)?

    我已经搜索了一段时间 但似乎在文档或 SO 中找不到任何有用的东西 这个问题并没有真正帮助我 因为它引用了修改程序集 而我正在用 C 编写 我有一些代码进行间接访问 我想对其进行矢量化 for i 0 i lt LENGTH i foo b