问题标签 [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 回答
14081 浏览

x86 - 4 个 32 位整数的 SSE 乘法

如何将四个 32 位整数乘以另外 4 个整数?我没有找到任何可以做到这一点的指令。

0 投票
4 回答
4150 浏览

c++ - SSE2 整数溢出检查

当使用 SSE2 指令(例如PADDD_mm_add_epi32内在指令)时,有没有办法检查是否有任何操作溢出?

我认为在溢出后可能会设置 MXCSR 控制寄存器上的标志,但我没有看到这种情况发生。例如,_mm_getcsr()在以下两种情况下打印相同的值 (8064):

是否有其他方法可以检查 SSE2 是否溢出?

0 投票
1 回答
24015 浏览

c++ - SSE 指令添加数组的所有元素

我是 SSE2 指令的新手。我找到了_mm_add_epi8可以添加两个数组元素的指令。但我想要一个可以添加数组所有元素的 SSE 指令。

我试图使用这段代码来开发这个概念:

那么有人可以告诉我如何使用 SSE2 指令添加数组的所有元素吗?

任何帮助将不胜感激。

0 投票
3 回答
5751 浏览

x86 - 在 Intel 上使用 SSE2 减少无符号字节的总和而不溢出

我试图在 Intel i3 处理器上找到 32 个元素(每个 1 字节数据)的总和减少。我这样做了:

但是,它需要更多时间,因为我的应用程序是一个需要更少时间的实时应用程序。请注意,最终总和可能超过 255。

有没有一种方法可以使用低级 SIMD SSE2 指令来实现?不幸的是,我从未使用过 SSE。为此,我尝试搜索 sse2 函数,但它也不可用。(sse)是否保证减少这种小型问题的计算时间?

有什么建议么??

注意:我已经使用 OpenCL 和 CUDA 实现了类似的算法,并且效果很好,但仅在问题规模很大时才有效。对于小型问题,开销成本更高。不确定它如何在 SSE 上运行

0 投票
2 回答
216 浏览

c - SSE 2 函数执行时间不恒定且超过正常值

在 Intel core2Duo 上使用 SSE 2。

sse_add() 和 normal_add() 所花费的时间在多次运行中不是恒定的,实际上现在经过多次修改后总是为 0。

该程序基本上找到以下矩阵的每一列的总和:

我已经验证了结果,并且这两个函数都正确:

为什么会这样?还是因为我没有正确测量时间?您能否在您的机器上运行相同的代码并进行验证?

更新根据建议,我放了一个 for 循环,如下所示,但时间仍然为 0(显然我必须将总时间除以迭代次数以获得正确的值,但为什么我得到总时间 0?):

}

原始程序如下。

*更新:删除所有 printf 和 malloc *

在单独的程序中一一计时功能:

上证版

普通版

0 投票
1 回答
1212 浏览

x86 - 使用 SSE2 模拟 packusdw 功能

我正在根据Intel [pdf]描述的算法在pixman中实现快速 x888 -> 565 像素转换功能。他们的代码转换 x888 -> 555 而我想转换为 565。不幸的是,转换为 565 意味着设置了高位,这意味着我不能使用有符号饱和包指令。无符号打包指令直到 SSE4.1 才添加。我想用 SSE2 实现它的功能或找到另一种方法。packusdw

此函数采用两个 XMM 寄存器,每个寄存器包含 4 个 32 位像素,并输出一个包含 8 个转换后的 RGB565 像素的 XMM 寄存器。

我想到的想法:

  • 减去 0x8000, _mm_packs_epi32,将 0x8000 重新添加到每个 565 像素。我已经尝试过了,但我无法做到这一点。

  • 随机播放数据而不是打包数据。适用于 MMX,但由于 SSE 16 位随机播放仅适用于高 64 位或低 64 位,因此会变得混乱。

  • 保存高位,将它们设置为零,打包,然后恢复它们。看起来很乱。

有没有其他(希望更有效)的方法可以做到这一点?

0 投票
1 回答
5173 浏览

c - 如何对齐 16 位整数以与 SSE 内在函数一起使用

我正在使用定义为的 16 位整数的二维数组

其中Max_SIZEMAX_NODE是常数值。我不是专业的程序员,但不知何故,在 StackOverflow 的帮助下,我设法编写了一段代码,在我的数据上部署了 SSE 指令并实现了显着的加速。目前,我正在使用不需要数据对齐的内在函数(主要是_mm_loadu_si128and _mm_storeu_si128)。

当我将内在函数更改为对齐数据的对应项(即_mm_load_si128_mm_store_si128)时,我会遇到运行时错误,这导致我假设我的数据未正确对齐。

我现在的问题是,如果我的数据没有正确对齐,我该如何对齐它才能使用相应的内在函数?我认为由于整数是 16 位,它们会自动对齐。但是我好像错了!

对此的任何见解都将受到高度赞赏。

谢谢!

0 投票
2 回答
1679 浏览

sse - 将内存中的 32 位加载到 xmm 寄存器中

内联汇编:

什么是等效的内在代码?

0 投票
1 回答
1937 浏览

c++ - float4::set_wxy (和其他 set-swizzle 操作)的更好的 SSE2 实现?

我正在使用 SSE2/AVX 内在函数在 C++ 中编写符合 HLSL float4 的类型,目前我正在实现 HLSL 中可用于 float4 的所有 set-swizzle 操作。我试图找出一个最佳的 SSE2 实现来处理涉及(swizzle)设置 2 或 3 个组件的 set-swizzle 操作(因为使用一个 SSE shuffle 操作来实现 4-component set-swizzles 是微不足道的)。例如,如果没有至少 4/5 SSE shuffle ops,我想不出更好的方法来实现 say set_wxy,例如:

在不使用 SSE2 之外的操作的情况下,是否有人对更好的实施有任何想法?因为我知道 SSE4/AVX 中的 _mm_blend_ps ,我将在通过预处理器条件可用时使用它,但我想至少支持一个仅 SSE2 的代码路径。提前致谢!

编辑:这个函数的行为的一个例子是:

基本上 set_wxy 按此顺序使用 x,y,z 的参数设置 w,x,y 分量,保留原始 z 值。

0 投票
2 回答
3931 浏览

c++ - SSE2、Visual Studio 2010 和调试版本

禁用优化时编译器能否自动使用 SSE2?

当优化被禁用时,/arch:SSE2 标志是否意味着什么?

我的任务是从我们的软件中榨取更多性能。不幸的是,发布构建是使用调试设置完成的,到目前为止,为优化案例争论的尝试都没有成功。

使用编译器标志为 x86 编译/ZI /Od /arch:SSE2 /FAs。生成的程序集表明编译器没有使用SSE2. 这是因为优化被禁用了吗?

在代码中,有几种类似的情况:

我想让编译器为我向量化这个操作,但它没有;我怀疑需要启用优化。

我手工编写了两种解决方案:一种使用内联__asm块,另一种使用<emmintrin.h>. 我宁愿不依赖这个。

更新

除上述问题外,我希望调用库函数,例如memcpy,在适当的时候使用提供的矢量化版本。查看 的汇编代码memcpy,我可以看到有一个调用的函数_VEC_memcpy用于SSE2 更快地复制。决定是否分支到此例程的块是:

我不认为这_VEC_memcpy被称为......永远

标志应该/arch:SSE2定义这个__sse2_available符号吗?