问题标签 [intrinsics]

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 回答
1878 浏览

c++ - 比较 SSE Intrinsics 中的符号位

如何使用 SSE 内在函数创建一个掩码,该掩码指示两个打包浮点数(__m128's)的符号是否相同,例如,如果比较 a 和 b 其中 a 为 [1.0 -1.0 0.0 2.0] 且 b 为 [1.0 1.0 1.0 1.0]我们得到的期望掩码是 [true false true true]。

0 投票
5 回答
6437 浏览

visual-c++ - Visual C++ 中的 128 位除法内在函数

我想知道 Visual C++ 中是否真的没有 128 位除法内在函数?

有一个 64x64=128 位乘法内在函数称为_umul128(),它很好地匹配MULx64 汇编指令。

自然地,我假设也会有一个 128/64=64 位除法内在函数(对DIV指令建模),但令我惊讶的是,Visual C++ 和 Intel C++ 似乎都没有它,至少它没有在 intrin.h 中列出。

有人可以确认吗?我尝试使用 grep 查找编译器可执行文件中的函数名称,但一开始找不到_umul128,所以我想我看错了地方。

更新:至少我现在umul128在 Visual C++ 2010 的 c1.dll 中找到了该模式(没有前导下划线)。所有其他内在函数都在它周围列出,但不幸的是没有“udiv128”之类的:(所以看起来他们真的已经“忘记”实施它。

澄清一下:我不仅在寻找 128 位数据类型,而且还在寻找一种在 C++ 中将 128 位标量 int 除以 64 位 int 的方法。无论是内在函数还是原生128 位整数支持都可以解决我的问题。

编辑:_udiv128答案是否定的, Visual Studio 2010 到 2017 年都没有内在特性,但它在 Visual Studio 2019 RTM 中可用

0 投票
3 回答
4247 浏览

x86 - _mm_alignr_epi8 (PALIGNR) 等效于 AVX2

在 SSE3 中,PAligNR 指令执行以下操作:

PARIGNR 将目标操作数(第一个操作数)和源操作数(第二个操作数)连接成一个中间组合,将组合以字节粒度向右移动一个常量立即数,并将右对齐的结果提取到目标中。

我目前正在移植我的 SSE4 代码以使用 AVX2 指令并使用 256 位寄存器而不是 128 位。天真地,我相信内在函数(VALIGNR)执行与仅在 256 位寄存器上_mm256_alignr_epi8相同的操作。_mm_alignr_epi8然而可悲的是,情况并非如此。实际上,_mm256_alignr_epi8将 256bit 寄存器视为 2 个 128bit 寄存器,对相邻的两个 128bit 寄存器执行 2 次“对齐”操作。_mm_alignr_epi8一次有效地执行与 2 个寄存器相同的操作。在这里最清楚地说明了这一点:_mm256_alignr_epi8

目前我的解决方案是_mm_alignr_epi8通过将 ymm(256 位)寄存器分成两个 xmm(128 位)寄存器(高和低)来继续使用,如下所示:

这行得通,但必须有更好的方法,对吧?是否应该使用更“通用”的 AVX2 指令来获得相同的结果?

0 投票
1 回答
940 浏览

c++ - Visual Studio 11 开发者预览版中的 BitScanForward64 问题

我对用 C 编写任何东西都是全新的。我正在编写一个执行二进制操作的辅助 DLL(从 C# 调用)。我收到“标识符“BitScanForward64”未定义”错误。32 位版本可用。我认为这是因为我创建了一个 Win32 DLL。

然后我恍然大悟,64 位版本可能仅适用于特定的 64 位 DLL(我在新项目向导中假设为“常规”),并且我可能需要单独的 32 位和 64 位 dll。是这种情况,还是我可以拥有一个同时运行 BitScanForward 和 BitScanForward64 内在函数的 DLL,如果是这样,我该如何创建它?

这是我当前的代码:

0 投票
1 回答
1747 浏览

c++ - 为 C 数学函数调用 MSVC 内置/内在函数

对于 GCC 和 Clang,我可以轻松做到这一点:

这就像一个魅力。我想对几乎每个数学函数都做类似的事情,并且我的代码也可以在 MSVC 上运行。我怎样才能为 MSVC 做与上述相同的操作?

编辑:为了清楚起见:问题是关于__builtin_*功能,没有别的。我试过

但这需要一个 abs 函数的声明,我不想在我的全局命名空间中拥有它。

0 投票
2 回答
4641 浏览

c++ - SSE 内在函数 - 比较 if/else 优化

我一直在尝试优化一些处理原始像素数据的代码。目前,代码的 C++ 实现太慢了,所以我一直在尝试使用 SSE 内在函数(SSE/2/3 不使用 4)和 MSVC 2008 来建立一些基础。考虑到这是我第一次在这个低点进行挖掘,我已经取得了一些不错的进展。

不幸的是,我遇到了一段让我卡住的特定代码:

目前,我在本节默认使用 C++ 实现,因为我无法完全理解如何使用 SSE 进行优化 - 我发现用于比较的 SSE 内在函数有点棘手。

任何建议/提示将不胜感激。

编辑: 一次处理单个像素的等效 C++ 代码将是:

基本上,我正在从 4:3 到 16:9 进行非线性边缘拉伸。

0 投票
1 回答
1205 浏览

c++ - InterlockedExchange Visual Studio 2010 内在

我在编译器的优化设置中启用了内在函数,但是,InterlockedExchange 的生成代码正在生成对 kernel32.dll 的调用,而不是生成内联程序集。这尤其成问题,因为该功能在 Vista 之前的 Windows 版本上不可用。

MSDN 文档指出“此功能是在可能的情况下使用编译器内在实现的”。是否可以让编译器使用 InterlockedExchange 的实际内在代码?

0 投票
1 回答
3590 浏览

gcc - 同时使用 SSE2 内在函数和 gcc 内联汇编程序

我试图在 gcc 中混合 SSE2 内在函数和内联汇编程序。但是,如果我将变量指定为 xmm0/register 作为输入,那么在某些情况下会出现编译器错误。例子:

当使用 gcc 版本 4.6.1 编译时,我得到:

奇怪的是,在我有其他输入变量/寄存器的相同情况下,它突然使用 xmm0 作为输入而不是 xmm1 等。在另一种情况下,我能够指定 xmm0-xmm4 但不能在上面指定。对此有点困惑/沮丧:S

谢谢 :)

0 投票
2 回答
578 浏览

c++ - SSE 内在函数导致正常浮点操作返回 -1.#INV

我在编写执行音频处理的 SSE 方法时遇到问题。我在这里根据英特尔的论文实现了一个 SSE 随机函数:

http://software.intel.com/en-us/articles/fast-random-number-generator-on-the-intel-pentiumr-4-processor/

我还有一种方法,它也使用 SSE 执行从 Float 到 S16 的转换,转换的执行非常简单,如下所示:

FloatRand4 定义如下:

如果返回结果并且sseresult != NULL未使用。这在第一个循环上完美执行,但在下一个循环上变为而不是. 如果我注释掉该行,问题就会消失。__m128resultdelta-1.#INF1.0__m64 con = _mm_cvtps_pi16(in);

我认为 FPU 正在进入一个未知的状态或什么的。

0 投票
3 回答
25354 浏览

c++ - SSE 指令集未启用

我遇到了这个错误:“SSE 指令集未启用”。我怎么能弄清楚这个?

我有ACER i7,Ubuntu 11.10,请问有人可以帮助我吗?

任何帮助将不胜感激!


也在运行:

给出:

实际上我试图安装gazebo-1.0.0-RC2-x86_64,并得到这个错误。


我的 cmakefile 中已经有了这个选项