问题标签 [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++ - WinAPI _Interlocked* char 的内部函数,短
我需要在 char 或 short 上使用 _Interlocked*** 函数,但它需要 long 指针作为输入。似乎有函数_InterlockedExchange8,我没有看到任何文档。看起来这是未记录的功能。编译器也找不到 _InterlockedAdd8 函数。我将不胜感激有关该功能的任何信息,使用/不使用的建议以及其他解决方案。
更新 1
我会尽量简化这个问题。我怎样才能使这项工作?
我看到了两种可能的解决方案
- 利用
_InterlockedExchange8
- 转换
another
为 long,进行交换并将结果转换回 X
第一个显然是不好的解决方案。第二个看起来更好,但是如何实现呢?
更新 2
你怎么看这样的事情?
谢谢。
c++ - 如何优化从半精度 float16 到单精度 float32 的转换?
我正在尝试提高我的功能的性能。Profiler 指向内部循环的代码。我可以提高该代码的性能,也许使用 SSE 内在函数?
更新:
拆卸
c++ - x64的“自定义内在”函数而不是内联汇编可能吗?
我目前正在尝试为我的库创建高度优化的、可重用的函数。例如,我用以下方式编写函数“是 2 的幂”:
这是一个可移植的、低维护的实现,作为内联 C++ 模板。此代码由 VC++ 2008 编译为以下带有分支的代码:
我还从这里找到了实现:"The bit twiddler",它将在 x64 的汇编中编码如下:
我在一个汇编模块(.asm 文件)中测试了与 C++ 分开编写的两个子例程,第二个的工作速度提高了 20%!
然而函数调用的开销是相当大的:如果我将第二个汇编实现“is_power_of_two_fast”与模板函数的内联版本进行比较,尽管有分支,后者更快!
不幸的是,x64 的新约定规定不允许内联汇编。应该改为使用“内在函数”。
现在的问题是:我可以将更快的版本“is_power_of_two_fast”实现为自定义内在函数或类似的东西,以便可以内联使用?或者,是否有可能以某种方式强制编译器生成函数的低分支版本?
c++ - 编译器如何处理 SSE(或任何)内在函数?
不久前,我在某处读到 SSE 内在函数编译成高效的机器代码,因为编译器对它们的处理与普通函数不同。我正在徘徊编译器实际上是如何做的,以及 C 程序员可以做些什么来促进这个过程。是否有关于如何以使编译器更轻松地生成高效机器代码的方式使用内部函数的指南。
谢谢。
visual-c++ - 在 Visual C++ 中删除 SSE2 内在函数
有谁知道如何从源代码中删除所有 SSE2 内在函数(在 Visual C++ 中)?由于我一直在使用 SSE2,因此在某些地方可能有一些。现在我想再次将我的项目移至 SSE。我想知道我是否可以通过一次编译来#define 一些东西来找到它们。
感谢您的帮助@Heandel 和 Necrolis
我确实是手动完成的 find "_mm_"... sort... 然后查找每个。
fortran - 对于不属于标准的 FORTRAN 内在函数,我该怎么办?
我正在尝试通过使用 gfortran 从源代码构建旧的 FORTRAN 代码来工作。我终于能够成功构建它,但是现在它运行时出现了越界错误。我使用 gdb 并将错误跟踪到使用 loc() 内部函数的函数。当我尝试打印 的值时loc(ae)
,其中 ae 是我传递的整数值,我收到错误“当前上下文中没有符号“loc”。” 我尝试使用 ifort 11.x 进行编译并使用 DDT 进行调试并得到相同的错误。对我来说,这意味着编译器对内在函数一无所知。
一点阅读表明 loc 内在函数不是 F77 标准的一部分,所以也许这就是问题的一部分。我在下面发布了内在函数的定义,但我不知道如何将其实现到我的代码中,以便可以使用 loc() 。
有什么建议还是我误解了我的问题?因为 gfortran 和 ifort 由于越界错误而在同一个地方崩溃,但是使用 loc() 的函数在两个编译器之间返回相同的大数字。如果两个编译器都返回相同的 loc 值,loc() 将不起作用,这似乎有点奇怪。
用法:
iaddr = loc(obj)
在哪里:
obj 是需要其地址的变量、数组、函数或子程序。iaddr 是地址为“obj”的整数。地址的格式与 LARn 指令存储的格式相同。
描述:
LOC 用于获取某物的地址。返回的值在 Fortran 中并不是真正有用,但可能需要 GMAP 子例程或非常特殊的调试。
c - 具有 SSE4.1 内在函数的双线性滤波器
我现在正试图为一个过滤后的样本找出一个相当快速的双线性过滤函数,作为习惯使用内在函数的练习——直到 SSE41 都可以。
到目前为止,我有以下内容:
该代码假定图像数据是 ARGB8 并且有一个额外的列和行来处理边缘情况而无需分支。
我正在寻求关于我可以使用哪些指令来减少这种笨拙的混乱的大小,当然还有如何改进它以更快地运行的建议!
谢谢 :)
c - SSE2值提取问题
我想从 128 位寄存器中提取值(第一个字 16 位),我得到了这个命令,但这不起作用。设置 a 的值后会有一些算术运算,而不是变量内的结果会有一些算术运算最后会改变我想提取第一个单词...我该怎么做...
c++ - SSE 内在函数中的 if/else 语句
我正在尝试使用 SSE 内在函数优化一小段代码(我是该主题的完整初学者),但我对条件的使用有点坚持。
我的原始代码是:
这段代码的目标是计算一个 crc 表(常数可以是任何多项式,它在这里不起作用),
我想我的优化代码是这样的:
我不知道如何通过 if-else 语句,但我怀疑有一个聪明的把戏。有没有人知道如何做到这一点?
(除此之外,我的优化可能很差 - 任何关于它的建议或更正都会受到最大的同情)
c - _mm_cmpistrm SSE4.2 固有模式
我试图弄清楚如何为_mm_cmpistrm SSE4.2 内在函数设置“模式”标志。我有一个常规的 C 字符串 (char*),我正在使用 _mm_lddqu_si128 将其加载到 __m128i 类型中。我打算将无符号字节与常规字符串比较一起使用:
但我对为单元设置什么与位掩码感到困惑。以下是 GCC 4.3.2 中 smmintrin.h 的宏:
我想我理解位掩码是什么:如果该位置的字符在两个字符串之间不同,我将在位 0..15 中得到 1。但是单位掩码有什么作用?