问题标签 [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++ - Visual C++ x64 添加带进位
由于似乎没有 ADC 的内在函数,而且我不能在 Visual C++ 中使用 x64 架构的内联汇编程序,如果我想使用带进位的 add 编写函数但将其包含在 C++ 命名空间中,我该怎么办?
(不能使用比较运算符进行模拟。这个 256 兆位的添加对性能至关重要。)
c - SSE 加载和添加
假设我有两个向量,由两个类型的数组表示double
,每个数组的大小为 2。我想添加相应的位置。所以假设向量i0
and 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
了?
谢谢,
optimization - 128 位 SSE 计数器?
我需要一个周期为 2^128 的 __m128i 变量的函数。它不需要单调增加(如计数器),而是访问每个值一次。
我能想到的最简单的例子实际上是一个 128 位的计数器,但我发现这很难在 SSE 中实现。有没有更简单/更快的解决方案?
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
谢谢!
character - 使用 SSE Intrinsics 计算字符串中的字符
我正在尝试在 C 中实现一个字符频率函数。这个任务当然非常简单,只需遍历字符串并像这样递增:
现在,当这样做超过十亿次或更多时(是的,我的文件那么大),程序的这一部分变得非常耗时,因为必须访问数组 10e8 * 长度次。
我在谷歌上搜索了一段时间,找到了很多如何使用寄存器进行加法、乘法、除法等操作的示例,但由于我对 SSE、MMX 等一点也不熟悉。我不知道如何实现字符使用这些函数进行计数。
我希望减少花在此功能上的时间,因为可以同时读取 4 个字符。您能否向我展示正确的方向,或者更好地展示一段代码?
提前致谢。标记
arm - Arm Neon Intrinsics 与手工组装
https://web.archive.org/web/20170227190422/http://hilbert-space.de/?p=22
在这个过时的网站上,它表明手写 asm 会比内在函数带来更大的改进。我想知道即使在 2012 年,这是否是当前的事实。
那么使用 gnu 交叉编译器对内部函数的编译优化是否有所改进?
c++ - 由于 _ReadBarrier() 未被调用而导致错误的示例程序是什么?
由于 _ReadBarrier() 未被调用而导致错误的示例程序是什么?
关于 _ReadBarrier() 的 MSDN 文章:http: //msdn.microsoft.com/en-us/library/z055s48f (v=vs.120).aspx
assembly - 访问封装在 128 位寄存器中的任意 16 位元素
使用英特尔编译器内在函数,给定一个 128 位寄存器,打包 8 个 16 位元素,我如何从寄存器中访问(廉价)任意元素,以便后续使用_mm_cvtepi8_epi64
(符号扩展两个 8 位元素,打包在较低寄存器的 16 位,到两个 64 位元素)?
我将解释我为什么问:
- 输入:具有 k 字节的内存缓冲区,每个字节为 0x0 或 0xff。
- 期望的输出:对于输入的每两个连续字节,一个寄存器分别用
0x0
和打包两个四字(64 位) 。0xffff ffff ffff ffff
- 最终目标:根据输入缓冲区的条目对 k 个双精度的缓冲区求和。
注意:输入缓冲区的值0x0
和0xff
可以更改为最有用的值,前提是在求和之前的屏蔽效果仍然存在。
从我的问题中可以看出,我目前的计划如下,跨输入缓冲区流式传输:
- 将输入掩码缓冲区从 8 位扩展到 64 位。
- 使用扩展掩码屏蔽双打缓冲区。
- 对蒙面双打求和。
谢谢,阿萨夫
c++ - 通过调用 _mm_stream_si64x() 实现性能提升的示例程序是什么?
通过调用 _mm_stream_si64x() 实现性能提升的示例程序是什么?
关于 _mm_stream_si64x 的 MSDN 文章:http: //msdn.microsoft.com/en-us/library/35b8kssy.aspx
fortran - Fortran get_environment_variable 内在函数不返回任何内容
我知道 Fortran 2003 包含内部子例程 get_environment_variable,但我无法让它返回我想要的变量。这是一个测试程序:
然后我在shell中设置t=2010010100(或者什么的),编译运行,唯一写的就是空行。我不明白:我正在使用带有标志-std = f2003的gfortran,这应该很简单,挂了什么?我怀疑这很简单,答案会暴露我的无知......但无论如何还是谢谢你!