问题标签 [sse2]

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 投票
2 回答
2601 浏览

c++ - SSE2 指令在 C++ 内联汇编中不起作用

我有这个函数,它使用 SSE2 将一些值加在一起,它应该将 lhs 和 rhs 加在一起并将结果存储回 lhs:

我的代码使用这样的函数:

但是这不起作用,因为当代码运行时它输出 1,2,3,4 而不是 2,4,6,8

0 投票
5 回答
23661 浏览

linux - 如何测试你的 Linux 是否支持 SSE2

其实我有2个问题:

  1. SSE2 兼容性是 CPU 问题还是编译器问题?
  2. 如何检查您的 CPU 或编译器是否支持 SSE2?

我正在使用 GCC 版本:

当我尝试编译代码时,它给了我这个错误:

cpuinfo展示了这一点:

0 投票
1 回答
1618 浏览

c - 64 位特定 simd 内在

我在 SSE2 中使用以下联合声明。

这个想法是为每个 a 和 b 分配两个无符号长变量(64 位长),对它们进行异或并将结果放在 c 中。

显式赋值 ( a.data[0] = something) 在这里有效,但需要更多时间。

我打算使用内在函数。如果我使用_mm_set_epi64 (unsigned long x, unsigned long y),它会要求__m64变量。如果我转换这些变量(__m64)x并且它工作正常,但它给出了错误的结果。

上面的代码给出了错误:

您能否建议一些替代方案(内在)?

0 投票
4 回答
4072 浏览

c - SIMD 代码比标量代码运行得慢

elma并且elmc都是unsigned long数组。res1和 也是如此res2

在 for 循环中包含元素 XOR 的非 simd 和 simd 版本。第二个 for 循环中的前两行执行显式 XOR,而其余行实现相同操作的 simd 版本。

此循环从外部调用数百次,因此优化此循环将有助于减少总计算时间。

问题是 simd 代码的运行速度比标量代码慢很多倍。

编辑:完成部分展开

但是,结果并没有太大变化;它仍然需要两倍的标量代码。

0 投票
2 回答
2443 浏览

c - SIMD 代码与标量代码

以下循环执行了数百次。
elma and elmc are both unsigned long (64-bit) arrays, so is res1 and res2.

在 for 循环中,标量版本的代码(已注释)运行速度是 simd 代码的两倍。下面提到了上述行的 cachegrind 输出(指令读取)。

行1:668,460,000 2 2
行2:668,460,000 1 1 1
行3:89,985,000 1 1 1 1
行4:89,985,000 1 1 1 1
行5:617,040,000 2 2行2
行6:44,992,500 0 0 0 0 LINE 0
LINE 7:44,992,500 0 0
LINE LINE LINE 8:44,992,500 0
LINE : : 128,550,000 0 0
第 10 行: . . .
第 11 行:205,680,000 0 0
第 12 行:205,680,000 0 0

从上图中可以看出,注释(标量代码)所需的指令数量明显少于 simd 代码。

如何使这段代码更快?

0 投票
4 回答
770 浏览

c - 如何使以下代码更快

上面提到的代码在我的程序中被多次调用(profiler 显示 98%)。

编辑:在内部循环中, res1[i + k] 值会为相同的 (i + k) 值加载多次。我在 while 循环中尝试了这个,我将所有 res1 值加载到 simd 寄存器(数组)中,并在最里面的 for 循环中使用数组元素来更新数组元素。完成两个 for 循环后,我将数组值存储回 res1、re2。但是计算时间随之增加。知道我哪里错了吗?这个想法似乎是正确的

欢迎任何使它更快的建议。

0 投票
3 回答
5864 浏览

c++ - SIMD:为什么 SSE RGB 到 YUV 颜色转换的速度与 c++ 实现的速度差不多?

我刚刚尝试优化 RGB 到 YUV420 转换器。使用查找表可以提高速度,使用定点算法也是如此。但是,我期待使用 SSE 指令获得真正的收益。我第一次尝试导致代码变慢,在链接所有操作之后,它的速度与原始代码大致相同。我的实现是否有问题,或者 SSE 指令不适合手头的任务?

一段原始代码如下:

这是使用 SSE 的版本

这是我在 SSE2 的第一次尝试,所以也许我错过了什么?仅供参考,我正在使用 Visual Studio 2008 在 Windows 平台上工作。

0 投票
1 回答
1539 浏览

optimization - 使用 TBB 使用少量指令(SSE2、SSE4)优化循环

我有一个简单的图像处理相关算法。简而言之,将浮点图像(平均值)减去 8 位图像,然后将结果保存到浮点图像(目标)

该函数主要由内部函数编写。

我曾尝试使用 TBB、parrallel_for 优化此功能,但我没有收到速度上的提升,而是受到了惩罚。

我应该怎么办 ?我应该使用更底层的方案,例如 TBB 任务来优化代码吗?

0 投票
1 回答
4281 浏览

c++ - 加速一些 SSE2 Intrinsics 以进行颜色转换

我正在尝试执行从 YCbCr 到 BGRA 的图像颜色转换(不要问 A 位,真让人头疼)。

无论如何,这需要尽可能快地执行,所以我使用编译器内在函数编写它以利用 SSE2。这是我第一次进入 SIMD 领域,我基本上是一个初学者,所以我确信我做的很多事情都是低效的。

我进行实际颜色转换的算术代码结果特别慢,英特尔的 VTune 将其显示为一个重要的瓶颈。

那么,有什么办法可以加快以下代码的速度?它以 32 位、一次 4 个像素完成。我最初尝试以 8 位,一次 16 个像素(如在上面的循环中),但计算导致整数溢出和转换中断。整个过程,包括英特尔 jpeg 解码,单个全高清场需要约 14 毫秒。如果我能把它降低到至少 12 毫秒,最好是 10 毫秒,那就太好了。

非常感谢任何帮助或提示。谢谢!

0 投票
2 回答
2151 浏览

vector - sse/sse2 双矩阵浮点向量乘法

我必须使用 sse/sse2 实现矩阵向量乘法。向量和矩阵很大。矩阵是双精度的,向量是浮点数。

关键是我必须对浮点数进行所有计算 - 当我从矩阵获取数据时,我将其提升为浮点数,进行计算并获得浮点向量(稍后在对浮点数进行一些额外计算之后,我必须添加一些浮点值(浮点数)矩阵)到双值(双矩阵)。

我的问题是如何使用 SSE/SSE2 来做到这一点 - 问题在于双精度 - 我有指向 double* 的指针,我必须以某种方式将 4 个双精度转换为 4 个浮点以适应 __mm128 ... ?