问题标签 [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.
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]。
visual-c++ - Visual C++ 中的 128 位除法内在函数
我想知道 Visual C++ 中是否真的没有 128 位除法内在函数?
有一个 64x64=128 位乘法内在函数称为_umul128()
,它很好地匹配MUL
x64 汇编指令。
自然地,我假设也会有一个 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 中可用
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 指令来获得相同的结果?
c++ - Visual Studio 11 开发者预览版中的 BitScanForward64 问题
我对用 C 编写任何东西都是全新的。我正在编写一个执行二进制操作的辅助 DLL(从 C# 调用)。我收到“标识符“BitScanForward64”未定义”错误。32 位版本可用。我认为这是因为我创建了一个 Win32 DLL。
然后我恍然大悟,64 位版本可能仅适用于特定的 64 位 DLL(我在新项目向导中假设为“常规”),并且我可能需要单独的 32 位和 64 位 dll。是这种情况,还是我可以拥有一个同时运行 BitScanForward 和 BitScanForward64 内在函数的 DLL,如果是这样,我该如何创建它?
这是我当前的代码:
c++ - 为 C 数学函数调用 MSVC 内置/内在函数
对于 GCC 和 Clang,我可以轻松做到这一点:
这就像一个魅力。我想对几乎每个数学函数都做类似的事情,并且我的代码也可以在 MSVC 上运行。我怎样才能为 MSVC 做与上述相同的操作?
编辑:为了清楚起见:问题是关于__builtin_*
功能,没有别的。我试过
但这需要一个 abs 函数的声明,我不想在我的全局命名空间中拥有它。
c++ - SSE 内在函数 - 比较 if/else 优化
我一直在尝试优化一些处理原始像素数据的代码。目前,代码的 C++ 实现太慢了,所以我一直在尝试使用 SSE 内在函数(SSE/2/3 不使用 4)和 MSVC 2008 来建立一些基础。考虑到这是我第一次在这个低点进行挖掘,我已经取得了一些不错的进展。
不幸的是,我遇到了一段让我卡住的特定代码:
目前,我在本节默认使用 C++ 实现,因为我无法完全理解如何使用 SSE 进行优化 - 我发现用于比较的 SSE 内在函数有点棘手。
任何建议/提示将不胜感激。
编辑: 一次处理单个像素的等效 C++ 代码将是:
基本上,我正在从 4:3 到 16:9 进行非线性边缘拉伸。
c++ - InterlockedExchange Visual Studio 2010 内在
我在编译器的优化设置中启用了内在函数,但是,InterlockedExchange 的生成代码正在生成对 kernel32.dll 的调用,而不是生成内联程序集。这尤其成问题,因为该功能在 Vista 之前的 Windows 版本上不可用。
MSDN 文档指出“此功能是在可能的情况下使用编译器内在实现的”。是否可以让编译器使用 InterlockedExchange 的实际内在代码?
gcc - 同时使用 SSE2 内在函数和 gcc 内联汇编程序
我试图在 gcc 中混合 SSE2 内在函数和内联汇编程序。但是,如果我将变量指定为 xmm0/register 作为输入,那么在某些情况下会出现编译器错误。例子:
当使用 gcc 版本 4.6.1 编译时,我得到:
奇怪的是,在我有其他输入变量/寄存器的相同情况下,它突然使用 xmm0 作为输入而不是 xmm1 等。在另一种情况下,我能够指定 xmm0-xmm4 但不能在上面指定。对此有点困惑/沮丧:S
谢谢 :)
c++ - SSE 内在函数导致正常浮点操作返回 -1.#INV
我在编写执行音频处理的 SSE 方法时遇到问题。我在这里根据英特尔的论文实现了一个 SSE 随机函数:
我还有一种方法,它也使用 SSE 执行从 Float 到 S16 的转换,转换的执行非常简单,如下所示:
FloatRand4 定义如下:
如果返回结果并且sseresult != NULL
未使用。这在第一个循环上完美执行,但在下一个循环上变为而不是. 如果我注释掉该行,问题就会消失。__m128
result
delta
-1.#INF
1.0
__m64 con = _mm_cvtps_pi16(in);
我认为 FPU 正在进入一个未知的状态或什么的。
c++ - SSE 指令集未启用
我遇到了这个错误:“SSE 指令集未启用”。我怎么能弄清楚这个?
我有ACER i7,Ubuntu 11.10,请问有人可以帮助我吗?
任何帮助将不胜感激!
也在运行:
给出:
实际上我试图安装gazebo-1.0.0-RC2-x86_64,并得到这个错误。
我的 cmakefile 中已经有了这个选项