在x86 CPU上将浮点数转换为int最快的方法是什么? 对于以下的任何组合,最好用C语言或汇编(可以用C语言表示): 32/64/80位浮点 – > 32/64位整数 我正在寻找一些比编译器更快的技术。
英特尔CPU上的程序计数器是否可以在内核模式或其他模式下直接读取(即没有“技巧”)?
compare函数是一个函数,它接受两个参数a和b并返回一个描述其顺序的整数。 如果a小于b ,结果是一些负整数。 如果a大于b ,结果是一些正整数。 否则, a和b相等,结果为零。 这个函数经常被用来参数化从标准库中sorting和searchalgorithm。 实现字符的comparefunction非常简单, 你简单地减去参数: int compare_char(char a, char b) { return a – b; } 这是有效的,因为两个字符之间的差异通常被假定为适合一个整数。 (注意,这个假设对于sizeof(char) == sizeof(int) )的系统来说并不适用。 这个技巧不能用来比较整数,因为两个整数之间的差别通常不适合整数。 例如, INT_MAX – (-1) = INT_MIN表明INT_MAX小于-1 (从技术上说,溢出会导致未定义的行为,但假设模运算)。 那么我们怎样才能有效地实现比较函数的整数? 这是我第一次尝试: int compare_int(int a, int b) { int temp; int result; __asm__ __volatile__ ( "cmp %3, %2 \n\t" "mov $0, […]
我正在使用Visual Studio 2013 Ultimate在MASM中编程汇编语言(x86)。 我想用一个数组来计算n个元素的斐波那契数列。 换句话说,我试图去一个数组元素,获取它之前的两个元素,将它们加起来,并将结果存储在另一个数组中。 我无法设置索引寄存器来完成这项工作。 我有我的程序设置像这样: TITLE fibonacci.asm INCLUDE Irvine32.inc .data fibInitial BYTE 0, 1, 2, 3, 4, 5, 6 fibComputed BYTE 5 DUP(0) .code main PROC MOVZX si, fibInitial MOVZX di, fibComputed MOV cl, LENGTHOF fibInitial L1: MOV ax, [si – 1] MOV dx, [si – 2] MOV bp, ax + dx […]
简介:我正在查看汇编代码来指导我的优化,并将int32添加到指针时看到大量符号或零扩展。 void Test(int *out, int offset) { out[offset] = 1; } ————————————- movslq %esi, %rsi movl $1, (%rdi,%rsi,4) ret 起初,我认为我的编译器在添加32位到64位整数时遇到了挑战,但是我已经用Intel ICC 11,ICC 14和GCC 5.3证实了这种行为。 这个线程证实了我的发现,但是不清楚符号或零扩展是否必要。 只有在高32位还没有设置的情况下,这个符号/零扩展才是必要的。 但是,x86-64 ABI不会足够聪明,需要吗? 我有点不情愿改变我所有的指针偏移ssize_t,因为注册溢出会增加代码的caching足迹。
我认为2的补充的全部意义在于可以以相同的方式对有符号和无符号数字执行操作。 维基百科甚至专门列出乘法作为有益的操作之一 。 那么为什么x86对每个mul和imul都有单独的指示? 这对于x86-64还是这样吗?
在MSVC(在Windows)和GCC(在Linux上)编译的代码中,Ivy Bridge系统的性能差异很大。 该代码做密集matrix乘法。 我得到GCC峰值的70%,MSVC只有50%。 我想我可能已经把它们的差异分离出来了,它们是如何将以下三个内在因素进行转换的。 __m256 breg0 = _mm256_loadu_ps(&b[8*i]) _mm256_add_ps(_mm256_mul_ps(arge0,breg0), tmp0) GCC做到这一点 vmovups ymm9, YMMWORD PTR [rax-256] vmulps ymm9, ymm0, ymm9 vaddps ymm8, ymm8, ymm9 MSVC做到这一点 vmulps ymm1, ymm2, YMMWORD PTR [rax-256] vaddps ymm3, ymm1, ymm3 请问有人可以解释一下,为什么这两个解决scheme可以在性能上有如此大的差异呢? 尽pipeMSVC使用一个较less的指令,它将负载连接到mult,也许这使得它更依赖(也许负载不能乱序)? 我的意思是常春藤桥可以在一个时钟周期内完成一个AVX负载,一个AVX mult和一个AVX添加,但这需要每个操作都是独立的。 也许问题在别处? 您可以在下面的最内层循环中看到GCC和MSVC的完整汇编代码。 您可以在这里看到循环的C ++代码循环展开,以达到Ivy Bridge和Haswell的最大吞吐量 g ++ -S -masm = intel matrix.cpp -O3 -mavx -fopenmp […]
我一直在分析我们在Intel Core Duo上的一些核心math,并且在研究各种平方根的方法时,我注意到一些奇怪的事情:使用SSE标量运算,取相反的平方根并乘以它得到sqrt,比使用本地的sqrt操作码! 我用一个循环来testing它: inline float TestSqrtFunction( float in ); void TestFunc() { #define ARRAYSIZE 4096 #define NUMITERS 16386 float flIn[ ARRAYSIZE ]; // filled with random numbers ( 0 .. 2^22 ) float flOut [ ARRAYSIZE ]; // filled with 0 to force fetch into L1 cache cyclecounter.Start(); for ( int i = 0 […]
我的一个朋友从Facebook上下载了一些恶意软件,我很好奇,看看它是怎么做的,而不会感染我自己。 我知道你不能真正反编译一个.exe,但我可以至less在Assembly中查看它或附加一个debugging器? 编辑说这不是一个.NET可执行文件,没有CLI头。
我正在使用Xcode 6 Beta 6。 这是一段时间以来一直在困扰我的东西,但现在已经到了几乎没有用的地步。 我的项目开始有一个体面的65个Swift文件和几个桥接的Objective-C文件(这实际上不是问题的原因)。 看起来像任何Swift文件的轻微修改(例如,在应用程序中几乎没有使用的类中添加一个简单的空白)将导致重新编译指定目标的整个Swift文件。 经过深入的调查,我发现几乎100%的编译时间是CompileSwift阶段,其中Xcode在目标的所有Swift文件上运行swiftc命令。 我做了一些进一步的调查,如果我只保留一个默认的控制器的应用程序委托编译是非常快,但是当我添加越来越多的我的项目文件,编译时间开始变得非常慢。 现在只有65个源文件,每次编译需要大约8/10秒。 一点都不快 。 除了这个之外,我还没有看到有关这个问题的任何文章,但它是Xcode 6的旧版本。所以我想知道在这种情况下是否是唯一的。 UPDATE 我已经在GitHub上检查了一些像Alamofire , Euler和CryptoSwift这样的Swift项目,但是他们没有足够的Swift文件进行实际的比较。 我发现唯一一个开始有一个体面的大小的项目是SwiftHN ,即使它只有一打源文件,我仍然能够validation同样的事情,一个简单的空间和整个项目需要重新编译,开始采取很less的时间(2/3秒)。 与分析器和汇编都快速的Objective-C代码相比,Swift永远无法处理大型项目,但请告诉我,我错了。 更新与Xcode 6 Beta 7 仍然没有任何改善。 这开始变得荒谬。 由于缺乏Swift中的#import ,我真的不知道苹果怎么能够优化这个。 更新与Xcode 6.3和Swift 1.2 苹果已经增加了增量构build (以及许多其他编译器优化)。 您必须将代码迁移到Swift 1.2才能看到这些好处,但Apple在Xcode 6.3中添加了一个工具来帮助您: 然而 不要像我那样快乐。 他们用来增加构build的图解算器还没有很好的优化。 事实上,首先,它不会查看函数签名的变化,所以如果在一个方法的块中添加一个空格,所有依赖于该类的文件都将被重新编译。 其次,它似乎是基于重新编译的文件创build树,即使更改不影响它们。 例如,如果您将这三个类移到不同的文件中 class FileA: NSObject { var foo:String? } class FileB: NSObject { var […]