问题标签 [simd]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
2121 浏览

iphone - 在 iPhone 上使用 ARM SIMD 进行游戏矢量/矩阵运算的正确方法是什么?

我正在为使用 iPhone(3GS 或更高版本)上的 SIMD 单元的游戏制作矢量/矩阵库。我怎样才能做到这一点?我搜索了这个,现在我知道了几个选项:

  • Apple (iPhone OS 4) 的加速框架 (BLAS+LAPACK+...)
  • 来自 ARM 的 OpenMAX 实现库
  • GCC 自动矢量化功能

什么是最适合游戏矢量/矩阵库的方式?

0 投票
2 回答
4262 浏览

visual-studio-2008 - 如何在 Visual Studio 2008 中启用 SSE3/SSE4.1 指令集?

我试图遵循:

项目 > 属性 > 配置属性 > C/C++ > 代码生成 > 启用增强指令集

但我得到的唯一选择是 - SSE 或 SSE2。

谢谢。

0 投票
3 回答
4496 浏览

c - 逻辑 SSE 内在函数之间有什么区别?

不同类型的逻辑 SSE 内在函数之间有什么区别吗?例如,如果我们进行 OR 运算,则有三个内在函数:_mm_or_ps,它们_mm_or_pd_mm_or_si128做同样的事情:计算它们的操作数的按位或。我的问题:

  1. 使用一个或另一个内在函数(使用适当的类型转换)有什么区别。在某些特定情况下会不会有任何隐性成本,例如更长的执行时间?

  2. 这些内在函数映射到三个不同的 x86 指令 ( por, orps, orpd)。有谁知道为什么英特尔将宝贵的操作码空间浪费在几条做同样事情的指令上?

0 投票
2 回答
1347 浏览

c++ - 同时使用多个 SIMD 指令集的好处

我正在编写一个高度并行的多线程应用程序。我已经编写了一个 SSE 加速线程类。如果我要编写一个 MMX 加速线程类,然后同时运行两者(每个内核一个 SSE 线程和一个 MMX 线程),性能会显着提高吗?

我认为这种设置将有助于隐藏内存延迟,但在我开始投入时间之前我想确定一下。

0 投票
5 回答
9049 浏览

visual-c++ - SSE SIMD 优化循环

我在循环中有一些代码

因此,u 和 b 是相同长度的向量,而 c 和 s 是标量。此代码是否适合与 SSE 一起使用以获得加速的矢量化?

更新

我学习了矢量化(如果你使用内在函数,这并不难)并在 SSE 中实现了我的循环。但是,在 VC++ 编译器中设置 SSE2 标志时,我得到的性能与我自己的 SSE 代码大致相同。另一方面,英特尔编译器比我的 SSE 代码或 VC++ 编译器快得多。

这是我写的代码供参考

0 投票
6 回答
8833 浏览

c++ - C++快速将2个数组加在一起

给定数组:

在所有值的范围从 0 到 100的情况下,C++ 中添加这两个数组的最快方法是什么,以便画布中的每个单元格等于自身加上插件中的相应单元格值?

IE,我想实现类似:

所以如果 canvas[0][0] =3 并且 addon[0][0] = 2 那么 canvas[0][0] = 5

速度在这里至关重要,因为我正在编写一个非常简单的程序来暴力破解背包类型的问题,并且会有数千万种组合。

作为一个额外的小问题(如果你能提供帮助,谢谢!)检查画布中的任何值是否超过 100 的最快方法是什么? 循环很慢!

0 投票
4 回答
6192 浏览

c - 快速 24 位数组 -> 32 位数组转换?

快速总结:

我有一个 24 位值的数组。关于如何将单个 24 位数组元素快速扩展为 32 位元素的任何建议?

细节:

我正在使用 DirectX 10 中的像素着色器实时处理传入的视频帧。一个绊脚石是我的帧来自捕获硬件,具有 24 位像素(作为 YUV 或 RGB 图像),但 DX10 需要 32 位像素纹理。因此,我必须先将 24 位值扩展为 32 位,然后才能将它们加载到 GPU 中。

我真的不在乎我将剩余的 8 位设置为什么,或者传入的 24 位在该 32 位值中的位置——我可以在像素着色器中修复所有这些。但我需要非常快速地完成从 24 位到 32 位的转换。

我对 SIMD SSE 操作不是很熟悉,但是从我粗略的一瞥看来,我似乎无法使用它们进行扩展,因为我的读写大小不同。有什么建议么?还是我被卡在按顺序按摩这个数据集?

这感觉非常愚蠢 - 我正在使用像素着色器进行并行处理,但在此之前我必须执行逐像素的顺序操作。我一定遗漏了一些明显的东西......

0 投票
2 回答
934 浏览

x86 - 如何将所有 1 加载到 mmx 寄存器中?为什么这不起作用?

当我搜索时,除了关于 64/32 位内容的意见问题外,似乎找不到任何东西。

根据我的 xcode 调试器(这是 C++ 中的内联 asm),在这 2 条指令之后,mm2 寄存器保存值 0x30500004ffffffff。现在我是 x86 程序集的新手,我的程序集课程是在我很久以前学习的 MIPS 中教授的,但我想这不起作用,因为我正在以 32 位模式和 rbx 编译(这是 photoshop 插件的一部分)( ebx、bx 等的 64 位版本,对吗?)在技术上可能不存在。我尝试了其他方法来获得所有 1,例如将 0xfffffffful 加载到 mm2 和另一个寄存器并进行乘法,但这似乎也不起作用。

我正在修复使用一些 SIMD 指令优化我的插件,但我似乎无法弄清楚或找到任何不会让我眼睛受伤的文档。任何帮助深表感谢!

0 投票
2 回答
2526 浏览

performance - 乘加运算的 Haskell 数学性能

我正在用 Haskell 编写游戏,而我目前在 UI 上的通过涉及大量的几何程序生成。我目前专注于识别一个特定操作的性能(C-ish 伪代码):

也就是说,四个浮点数的沼泽标准乘加,适合 SIMD 优化的那种东西。

结果将发送到 OpenGL 顶点缓冲区,因此最终必须转储到平面 C 数组中。出于同样的原因,可能应该在 C 'float' 类型上进行计算。

我已经在 Haskell 中寻找库或本地惯用解决方案来快速完成此类事情,但我提出的每个解决方案似乎都徘徊在性能的 2% 左右(即慢 50 倍)与来自 GCC 的 C 具有正确的标志。诚然,我几周前开始使用 Haskell,所以我的经验有限——这就是我来找你们的原因。你们中的任何人都可以为更快的 Haskell 实现提供建议,或者提供有关如何编写高性能 Haskell 代码的文档的指针吗?

首先,最新的 Haskell 解决方案(时钟大约 12 秒)。我尝试了这篇 SO post中的 bang-patterns 内容,但 AFAICT 并没有什么不同。将 'multAdd' 替换为 '(\iv -> v * 4)' 将执行时间降低到 1.9 秒,因此按位计算(以及随之而来的对自动优化的挑战)似乎并没有太大的错误。

这就是我在 C 中的内容。这里的代码有一些 #ifdefs 可以防止它被直接编译;向下滚动查看测试驱动程序。

该脚本将编译并运行带有许多 gcc 标志组合的测试。cmath-64-native-O3-restrict-vector-nocopy 在我的系统上获得了最佳性能,耗时 0.22 秒。

0 投票
3 回答
621 浏览

ruby - 红宝石 SIMD 和 SSE

我想知道是否有办法扩展 ruby​​ 数组类型来进行 SIMD 和 SSE 向量计算。

我的意思是用一种低级语言实现,以在 ruby​​ 程序中用于数字运算任务。