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

c++ - Visual C++ x64 添加带进位

由于似乎没有 ADC 的内在函数,而且我不能在 Visual C++ 中使用 x64 架构的内联汇编程序,如果我想使用带进位的 add 编写函数但将其包含在 C++ 命名空间中,我该怎么办?

(不能使用比较运算符进行模拟。这个 256 兆位的添加对性能至关重要。)

0 投票
2 回答
2771 浏览

c - SSE 加载和添加

假设我有两个向量,由两个类型的数组表示double,每个数组的大小为 2。我想添加相应的位置。所以假设向量i0and i1,我想把 and 加i0[0] + i1[0]在一起i0[1] + i1[1]

由于类型是double,我需要两个寄存器。诀窍是将i0[0]andi1[0]i0[1]andi1[1]放在另一个中,然后将寄存器与自身相加。

我的问题是,如果我调用_mm_load_ps(i0[0])then _mm_load_ps(i1[0]),那会将它们分别放在低位和高位 64 位中,还是会用第二个替换寄存器load?我如何将两个双打放在同一个寄存器中,这样我就可以打电话add_ps了?

谢谢,

0 投票
2 回答
852 浏览

optimization - 128 位 SSE 计数器?

我需要一个周期为 2^128 的 __m128i 变量的函数。它不需要单调增加(如计数器),而是访问每个值一次。

我能想到的最简单的例子实际上是一个 128 位的计数器,但我发现这很难在 SSE 中实现。有没有更简单/更快的解决方案?

0 投票
2 回答
622 浏览

assembly - 如何加载 16 个 8 位数据并将它们连接到 4 个无符号整数?

有没有什么优雅的方法可以加载 16 个 8 位数据并将它们连接到 4 个 unsigned int ?

如下:

通过 _mm_load_si128() 将以下数组(16 Epi8)加载到 __m128i

0x00、0x11、0x22、0x33、0x44、0x55、0x66、0x77、0x88、0x99、0xaa、0xbb、0xcc、0xdd、0xee、0xff

然后进行一些操作,使寄存器(__m128i)变为 4 Epi32,

0x33221100, 0x77665544, 0xbbaa8899, 0xffeeddcc

谢谢!

0 投票
0 回答
371 浏览

character - 使用 SSE Intrinsics 计算字符串中的字符

我正在尝试在 C 中实现一个字符频率函数。这个任务当然非常简单,只需遍历字符串并像这样递增:

现在,当这样做超过十亿次或更多时(是的,我的文件那么大),程序的这一部分变得非常耗时,因为必须访问数组 10e8 * 长度次。

我在谷歌上搜索了一段时间,找到了很多如何使用寄存器进行加法、乘法、除法等操作的示例,但由于我对 SSE、MMX 等一点也不熟悉。我不知道如何实现字符使用这些函数进行计数。

我希望减少花在此功能上的时间,因为可以同时读取 4 个字符。您能否向我展示正确的方向,或者更好地展示一段代码?

提前致谢。标记

0 投票
4 回答
9575 浏览

arm - Arm Neon Intrinsics 与手工组装

https://web.archive.org/web/20170227190422/http://hilbert-space.de/?p=22

在这个过时的网站上,它表明手写 asm 会比内在函数带来更大的改进。我想知道即使在 2012 年,这是否是当前的事实。

那么使用 gnu 交叉编译器对内部函数的编译优化是否有所改进?

0 投票
1 回答
313 浏览

c++ - 由于 _ReadBarrier() 未被调用而导致错误的示例程序是什么?

由于 _ReadBarrier() 未被调用而导致错误的示例程序是什么?

关于 _ReadBarrier() 的 MSDN 文章:http: //msdn.microsoft.com/en-us/library/z055s48f (v=vs.120).aspx

0 投票
3 回答
943 浏览

assembly - 访问封装在 128 位寄存器中的任意 16 位元素

使用英特尔编译器内在函数,给定一个 128 位寄存器,打包 8 个 16 位元素,我如何从寄存器中访问(廉价)任意元素,以便后续使用_mm_cvtepi8_epi64(符号扩展两个 8 位元素,打包在较低寄存器的 16 位,到两个 64 位元素)?


我将解释我为什么问:

  1. 输入:具有 k 字节的内存缓冲区,每个字节为 0x0 或 0xff。
  2. 期望的输出:对于输入的每两个连续字节,一个寄存器分别用0x0和打包两个四字(64 位) 。0xffff ffff ffff ffff
  3. 最终目标:根据输入缓冲区的条目对 k 个双精度的缓冲区求和。

注意:输入缓冲区的值0x00xff可以更改为最有用的值,前提是在求和之前的屏蔽效果仍然存在。

从我的问题中可以看出,我目前的计划如下,跨输入缓冲区流式传输:

  1. 将输入掩码缓冲区从 8 位扩展到 64 位。
  2. 使用扩展掩码屏蔽双打缓冲区。
  3. 对蒙面双打求和。

谢谢,阿萨夫

0 投票
2 回答
237 浏览

c++ - 通过调用 _mm_stream_si64x() 实现性能提升的示例程序是什么?

通过调用 _mm_stream_si64x() 实现性能提升的示例程序是什么?

关于 _mm_stream_si64x 的 MSDN 文章:http: //msdn.microsoft.com/en-us/library/35b8kssy.aspx

0 投票
1 回答
774 浏览

fortran - Fortran get_environment_variable 内在函数不返回任何内容

我知道 Fortran 2003 包含内部子例程 get_environment_variable,但我无法让它返回我想要的变量。这是一个测试程序:

然后我在shell中设置t=2010010100(或者什么的),编译运行,唯一写的就是空行。我不明白:我正在使用带有标志-std = f2003的gfortran,这应该很简单,挂了什么?我怀疑这很简单,答案会暴露我的无知......但无论如何还是谢谢你!