问题标签 [sse]

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 投票
9 回答
2554 浏览

c++ - 特殊 CPU 功能的 C/C++ 使用

我很好奇,新编译器是否使用新 CPU 中内置的一些额外功能,例如 MMX SSE、3DNow!所以?

我的意思是,在最初的 8086 中甚至没有 FPU,所以旧的编译器甚至不能使用它,但是新的编译器可以,因为 FPU 是每个新 CPU 的一部分。那么,新的编译器是否使用了 CPU 的新特性?

或者,更应该问的是,新的 C/C++ 标准库函数是否使用了新特性?

感谢您的回答。

编辑:

好的,所以,如果我让你们所有人都说对了,即使是一些标准操作,尤其是浮点数,也可以使用 SSE 更快地完成。

为了使用它,我必须在我的编译器中启用这个特性,如果它支持的话。如果是这样,我必须确保目标平台支持该功能。

对于某些需要顶级性能的系统库,如OpenGL、DirectX等,系统可能会支持这种支持。

默认情况下,出于兼容性原因,编译器不支持它,但您可以使用 Intel 等提供的特殊 C 函数添加此支持。这应该是最好的方式,因为您可以直接控制天气,当您使用所需平台的特殊功能时,可以编写支持多 CPU 的应用程序。

0 投票
1 回答
1629 浏览

g++ - 内在程序 (SSE) - g++ - 需要帮助

这是我第一次在 stackoverflow 上发布问题,所以请尝试忽略我在格式化问题/代码时可能犯的任何错误。但请向我指出同样的问题,这样我可能会更加小心。

我试图编写一些简单的内在函数例程来添加两个 128 位(包含 4 个浮点变量)数字。我在网上找到了一些代码,并试图让它在我的系统上运行。代码如下:

我使用的 g++ 参数是:

我得到的错误如下:

我花了很多时间尝试调试这些错误,搜索它们等等。我是内在学的完全菜鸟,因此可能忽略了一些重要的事情。

感谢您提供任何帮助,
谢谢,
Sriram。

0 投票
5 回答
9049 浏览

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

我在循环中有一些代码

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

更新

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

这是我写的代码供参考

0 投票
1 回答
695 浏览

assembly - 需要对我的 SSE/Assembly 尝试进行一些建设性的批评

我正在努力将一些代码转换为 SSE,虽然我有正确的输出,但结果却比标准 c++ 代码慢。

我需要这样做的代码是:

我对 SSE 代码的了解是:

由于它很难阅读代码,我将解释我做了什么:

加载向量4,xmm0 _____ p = [px,py,px,py]
mult。通过vector4,xmm1 _ cs = [c,c,s,s]
__________________________mult----------------------------
结果,_____________ xmm0 = [px c, py c, px s, py s]

重用结果,xmm0 = [px c, py c, px s, py s]
洗牌结果, xmm2 = [py s, px s, py c, px c]
_____________________减法---------- ---------------
结果,xmm0 = [px c-py s,py c-px s,px s-py c,py s-px c]

重用结果,xmm0 = [px c-py s, py c-px s, px s-py c, py s-px c]
load m vector4, scale = [m, m, m, m]
__________________________mult---- ------------------------
结果,xmm0 = [(px c-py s) m, (py c-px*s) m, (px s-py*c) m, (py s-px*c) m]


加载 xy vector4, xmm3 = [p2x, p2x, p2y, p2y]
重用, xmm0 = [(px
c-py*s) m, (py c-px*s) m, (px s-py*c) m, (py s-px*c) m]
_____________________减------------------ -------
结果,xmm3 = [p2x-(px
c-py*s) m, p2x-(py c-px*s) m, p2y-(px s-py*c) m, p2y-(py s-px*c)*m]

然后 ox = xmm3[0] 和 oy = xmm3[3],所以我基本上不使用 xmm3[1] 或 xmm3[4]

对于阅读本文的困难,我深表歉意,但我希望有人能够为我提供一些指导,因为标准 c++ 代码运行时间为 0.001444 毫秒,而 SSE 代码运行时间为 0.00198 毫秒。

让我知道我是否可以做些什么来进一步解释/清理一下。我尝试使用 SSE 的原因是因为我运行了这个计算数百万次,它是减慢我当前代码的一部分。

提前感谢您的帮助!布雷特

0 投票
1 回答
1654 浏览

g++ - g ++ SSE内在困境-内在“饱和”的价值

我编写了一个简单的程序来实现 SSE 内在函数,用于计算两个大(100000 或更多元素)向量的内积。该程序比较了两者的执行时间,内积计算传统方式和使用内在函数。一切正常,直到我在计算内积的语句之前插入(只是为了好玩)一个内循环。在我继续之前,这里是代码:

我使用以下 g++ 调用来构建它:

上面的每个循环,在这两个函数中,总共运行 N^2 次。但是,假设 arr1 和 arr2(两个浮点向量)加载的值为 2.5,则数组的长度为 100,000,两种情况下的结果都应为 6.25e+10。我得到的结果是:

结果:
result_Conventional = 6.25e+10
result_Intrinsics = 5.36871e+08

这还不是全部。从使用内在函数的函数返回的值似乎在上述值处“饱和”。我尝试为数组元素和不同大小设置其他值。但似乎数组内容的任何大于 1.0 的值和大于 1000 的任何大小都符合我们在上面看到的相同值。

最初,我认为这可能是因为 SSE 中的所有操作都是浮点数,但浮点数应该能够存储 e+08 数量级的数字。

我试图看看我可能出错的地方,但似乎无法弄清楚。我正在使用 g++ 版本:g++ (GCC) 4.4.1 20090725 (Red Hat 4.4.1-2)。

非常欢迎对此提供任何帮助。

谢谢,
斯里拉姆。

0 投票
3 回答
4794 浏览

assembly - 具有延迟和吞吐量的简明 SSE 和 MMX 指令参考

我正在尝试通过使用带有内联汇编的 MMX 和 SSE 指令集来优化一些算术。但是,我一直无法找到有关这些增强指令集的时序和用法的良好参考。您能否帮我找到包含有关吞吐量、延迟、操作数以及指令的简短描述的信息的参考资料?

到目前为止,我发现:

英特尔指令参考 英特尔 64 和 IA-32 架构开发人员手册:卷。2AIntel 64 和 IA-32 架构开发人员手册:卷。2B

英特尔优化指南 http://www.intel.com/Assets/PDF/manual/248966.pdf

整数运算的时序 http://gmplib.org/~tege/x86-timing.pdf

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 投票
1 回答
498 浏览

c - 使用 SSE 进行钳位的快​​速双 -> 短转换?

有没有一种快速的方法可以将双精度值转换为短裤(16 位有符号),目前我正在做这样的事情:

我怀疑有一种使用 SSE 的快速方法可以显着提高效率。

0 投票
1 回答
551 浏览

c - 如何将 SSE 与 Windows 编译器和 GCC 编译器一起使用?

我必须使用 SSE 扩展优化一段代码。我的目标平台是 Windows 和 Linux,所以我使用 MS 编译器 (VStudio) 和 GCC 编译器构建我的应用程序。

涉及 SSE 的方法有哪些?我可以找到很多如何将 SSE 与 GCC 一起使用的示例,但它们似乎与 MS 编译器不兼容。是否存在多平台 SSE 方法?

0 投票
3 回答
621 浏览

ruby - 红宝石 SIMD 和 SSE

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

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