问题标签 [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 投票
4 回答
1432 浏览

c++ - 如何在 VS2008 64 位构建中将 __asm jno no_oflow 替换为内部结构?

我有这个代码:

它会产生这个很好的警告:

错误 C4235:使用了非标准扩展:此架构不支持“__asm”关键字

什么是此代码的等效/可接受的替代方法来检查它之前发生的减法运算的溢出?

0 投票
6 回答
13132 浏览

assembly - x86 最大/最小 asm 指令?

是否有任何 asm 指令可以加快 Core i7 架构上双精度/整数向量的最小值/最大值的计算?

更新:

没想到这么丰富的答案,谢谢。所以我看到 max/min 可以在没有分支的情况下完成。我有子问题:

有没有一种有效的方法来获取数组中最大双精度数的索引?

0 投票
3 回答
3205 浏览

c++ - VC++ SSE 内在优化怪异

我正在从文件中执行 8 位数据的分散读取(De-Interleaving a 64 channel wave file)。然后我将它们组合成一个字节流。我遇到的问题是我重新构建要写出的数据。

基本上我正在读取 16 个字节,然后将它们构建到单个 __m128i 变量中,然后使用 _mm_stream_ps 将值写回内存。但是我有一些奇怪的性能结果。

在我的第一个方案中,我使用 _mm_set_epi8 内在函数来设置我的 __m128i,如下所示:

基本上我让编译器决定如何优化它以提供最佳性能。这给出了最差的性能。我的测试在 ~0.195 秒内运行。

其次,我尝试使用 4 _mm_set_epi32 指令进行合并,然后将它们打包:

这确实在一定程度上提高了性能。我的测试现在在 ~0.15 秒内运行。这样做似乎违反直觉,因为我认为这正是 _mm_set_epi8 正在做的事情......

我最后的尝试是使用一些代码,我用老式的方式制作四个 CC(使用 shift 和 ors),然后使用单个 _mm_set_epi32 将它们放入 __m128i 中。

这提供了更好的性能。运行我的测试大约需要 0.135 秒。我真的开始迷茫了。

所以我尝试了一个简单的读字节写字节系统,它甚至比最后一种方法快得多。

那么发生了什么?这一切对我来说似乎违反直觉。

我已经考虑过延迟发生在 _mm_stream_ps 上的想法,因为我提供数据的速度太快了,但是无论我做什么,我都会得到完全相同的结果。前两种方法是否可能意味着 16 个负载无法通过循环分配以隐藏延迟?如果是这样,为什么会这样?当然,内在函数允许编译器随心所欲地进行优化..我认为这就是重点......而且执行 16 次读取和 16 次写入肯定会比使用一堆 SSE 杂耍的 16 次读取和 1 次写入慢得多说明......毕竟它的读写速度很慢!

任何有任何想法的人都将不胜感激!:D

编辑:在下面的评论之后,我停止将字节预加载为常量并将其更改为:

这将性能提高到 ~0.143 秒。Sitll 不如直接的 C 实现...

再次编辑:迄今为止我得到的最佳表现是

这使我可以在 ~0.095 秒内进行处理,这要好得多。不过,我似乎无法与 SSE 接近……我仍然对此感到困惑,但是……哼哼。

0 投票
1 回答
18289 浏览

c++ - Linux/gcc 中的 InterlockedIncrement 等价物

这将是一个非常简单的问题(可以重复),但我找不到它。

Win32 API 提供了一组非常方便的原子操作(作为内在函数),例如InterlockedIncrement发出lock addx86 代码。此外,InterlockedCompareExchange映射到lock cmpxchg.

但是,我想用 gcc 在 Linux 中做到这一点。由于我使用的是 64 位,因此不可能使用内联汇编。gcc 有内在函数吗?

0 投票
4 回答
38391 浏览

c++ - 什么是内在函数?

谁能解释它们是什么以及我为什么需要它们?如果我需要使用内在函数,我会构建什么样的应用程序?

0 投票
1 回答
718 浏览

atomic - _mm_mwait 是如何工作的?

如何_mm_mwaitpmmintrin.h工作?(我的意思不是它的 asm,而是行动以及如何在 NUMA 系统中采取这种行动store监控很容易在基于总线的 SMP 系统上实现,并具有总线侦听功能。)

什么处理器实现它?

它用于某些自旋锁吗?

0 投票
4 回答
6855 浏览

arm - 如何使用 ARM Neon 内在函数重新排序矢量数据?

这与 ARM Neon SIMD 编码特别相关。我正在为视频解码器中的某些模块使用 ARM Neon instrinsics。我有一个矢量化数据如下:

Neon 寄存器中有四个 32 位元素 - 例如 Q0 - 大小为 128 位。

在其他 Neon 寄存器中还有另外四个 32 位元素,例如 Q1,其大小为 128 位。

我希望最终数据有序,如下所示:

什么 Neon instrinsics 可以实现所需的数据顺序?

0 投票
1 回答
2175 浏览

c++ - 英特尔 AVX 内在函数:有任何兼容性库吗?

是否有任何英特尔 AVX 内在函数库?如果 SSE2 整数内在函数在编译时不可用,我正在寻找类似于 'sse2mmx.h' 标头的东西,它会回退到 MMX 内在函数。因此,如果我有类似的 AVX 库,我可以为新硬件编写优化代码,在 AVX 扩展不可用的情况下,这将具有几乎最佳的速度。到目前为止,谷歌搜索并没有太大帮助:(

0 投票
3 回答
681 浏览

c++ - 通过引用内联函数传递 __m128i 对象会导致这些对象移动到堆栈吗?

我正在使用 SSE2 内在函数为 8x16 位向量编写转置函数。由于该函数有 8 个参数(一个 8x8x16 位大小的矩阵),我只能通过引用传递它们。编译器会对此进行优化吗(我的意思是,这些 __m128i 对象会在寄存器而不是堆栈中传递)吗?

代码片段:

0 投票
3 回答
4496 浏览

c - 逻辑 SSE 内在函数之间有什么区别?

不同类型的逻辑 SSE 内在函数之间有什么区别吗?例如,如果我们进行 OR 运算,则有三个内在函数:_mm_or_ps,它们_mm_or_pd_mm_or_si128做同样的事情:计算它们的操作数的按位或。我的问题:

  1. 使用一个或另一个内在函数(使用适当的类型转换)有什么区别。在某些特定情况下会不会有任何隐性成本,例如更长的执行时间?

  2. 这些内在函数映射到三个不同的 x86 指令 ( por, orps, orpd)。有谁知道为什么英特尔将宝贵的操作码空间浪费在几条做同样事情的指令上?