相关疑难解决方法(0)

用于测试Collat​​z猜想的C++代码比手写程序集更快 - 为什么?

我为Project Euler Q14编写了这两个解决方案,在汇编和C++中.它们是用于测试Collat​​z猜想的相同蛮力方法.装配解决方案与组装

nasm -felf64 p14.asm && gcc p14.o -o p14
Run Code Online (Sandbox Code Playgroud)

C++是用.编译的

g++ p14.cpp -o p14
Run Code Online (Sandbox Code Playgroud)

部件, p14.asm

section .data
    fmt db "%d", 10, 0

global main
extern printf

section .text

main:
    mov rcx, 1000000
    xor rdi, rdi        ; max i
    xor rsi, rsi        ; i

l1:
    dec rcx
    xor r10, r10        ; count
    mov rax, rcx

l2:
    test rax, 1
    jpe even

    mov rbx, 3
    mul rbx
    inc rax
    jmp c1

even:
    mov rbx, 2 …
Run Code Online (Sandbox Code Playgroud)

c++ optimization performance x86 assembly

803
推荐指数
8
解决办法
14万
查看次数

在C/C++中使用汇编语言

我记得在某处可以真正优化和加速代码的某些部分,程序员用汇编语言编写该部分.我的问题是 -

  1. 这种做法还在做吗?一个人怎么做?
  2. 不是用汇编语言编写有点过于繁琐和陈旧吗?
  3. 当我们编译C代码(带或不带-O3标志)时,编译器会进行一些代码优化并链接所有库并将代码转换为二进制对象文件.因此,当我们运行程序时,它已经处于最基本的形式,即二进制.那么如何诱导'汇编语言'有帮助?

我正在努力理解这个概念,非常感谢任何帮助或链接.

更新:根据dbemerlin的要求改写第3点 - 因为您可能能够编写比编译器生成的更有效的汇编代码,但除非您是汇编专家,否则您的代码运行速度会慢,因为编译器通常会比大多数人更好地优化代码.

c c++ optimization assembly compiler-optimization

43
推荐指数
4
解决办法
1万
查看次数

INC指令与ADD 1:重要吗?

来自Ira Baxter回答,为什么INC和DEC指令不会影响进位标志(CF)?

大多数情况下,我远离INCDEC现在,因为他们做的部分条件代码更新,这样就可以在管道中引起滑稽的摊位,和ADD/ SUB没有.因此,无关紧要(大多数地方),我使用ADD/ SUB避免失速.我使用INC/ DEC仅在保持代码较小的情况下,例如,适合高速缓存行,其中一个或两个指令的大小产生足够的差异.这可能是毫无意义的纳米[字面意思!] - 优化,但我在编码习惯上相当老派.

我想问一下为什么它会导致管道中的停顿,而添加不会?毕竟,无论是ADDINC更新标志寄存器.唯一的区别是INC不更新CF.但为什么重要呢?

performance x86 assembly increment micro-optimization

26
推荐指数
2
解决办法
4234
查看次数

如何使用SIMD实现atoi?

我想尝试使用SIMD指令编写atoi实现,包含在RapidJSON(C++ JSON /写库)中.它目前在其他地方有一些SSE2和SSE4.2优化.

如果是速度增益,atoi则可以并行执行多个结果.字符串最初来自JSON数据的缓冲区,因此多atoi函数将不得不进行任何所需的调配.

我想出的算法如下:

  1. 我可以用以下方式初始化长度为N的向量:[10 ^ N..10 ^ 1]
  2. 我将缓冲区中的每个字符转换为整数并将它们放在另一个向量中.
  3. 我将有效数字向量中的每个数字乘以数字向量中的匹配数,并将结果相加.

我的目标是x86和x86-64架构.

我知道AVX2支持三个操作数Fused Multiply-Add,所以我将能够执行Sum = Number*有效数字+和.
那是我到目前为止的地方.
我的算法是否正确?有没有更好的办法?
是否有使用任何SIMD指令集的atoi参考实现?

c++ x86 sse simd atoi

25
推荐指数
2
解决办法
3598
查看次数

获得64位整数乘法的高分

在C++中,说:

uint64_t i;
uint64_t j;
Run Code Online (Sandbox Code Playgroud)

然后i * j将产生一个uint64_t值为i和之间的乘法的下半部分j,即(i * j) mod 2^64.现在,如果我想要乘法的较高部分怎么办?我知道在使用32位整数时,存在一个汇编指令做类似的事情,但我对汇编并不熟悉,所以我希望得到帮助.

制作以下内容的最有效方法是:

uint64_t k = mulhi(i, j);
Run Code Online (Sandbox Code Playgroud)

c++ 64-bit assembly multiplication

22
推荐指数
4
解决办法
1万
查看次数

与汇编相比,C效率低吗?

可能重复:
汇编程序什么时候比C快?

你好,

这纯粹是一个理论问题,因此,如果有一个"无限"时间来制作一个简单的程序,以及对C和汇编的高级知识,那么在汇编中做一些事情真的更好吗?将C编译成汇编(机器代码)时,"性能"会丢失吗?

根据性能我的意思是,现代C编译器在某些任务中做得不好,直接在Assembly中编程加速吗?

谢谢.

c compiler-construction assembly

7
推荐指数
6
解决办法
5203
查看次数

_umul128 在 Windows 32 位上

在 Visual C++ 中,_umul128 在面向 Windows 32 位时未定义。面向 Win32 时如何将两个无符号 64 位整数相乘?该解决方案只需要在面向 Windows 32 位的 Visual C++ 2017 上运行。

x86 biginteger intrinsics visual-c++

5
推荐指数
1
解决办法
1173
查看次数

你可以将游戏反编译为它的原始源代码吗?

我以战地4为例,这可以用于任何游戏.

我一直想知道这样的事情是否可行:

由于BF4正在运行客户端,这意味着您拥有构成游戏的所有代码.

它在技术上是否可以反编译代码并查看它的来源?

一直到游戏的核心机制?

或者是否有某种加密保护它?

我确实意识到,如果你成功地反编译这样的东西,那将是一个混乱处理而根本没有组织,但是,嘿,它仍然是源头.

只是一些我无法找到任何其他地方的答案.

windows exe decompiler

3
推荐指数
3
解决办法
1万
查看次数

自定义循环更快的原因是什么?坏编译器?不安全的自定义代码?运气?(幸运缓存命中)

我刚刚开始学习汇编并制作一些自定义循环,用于使用C++的asm {}体交换两个变量,使用C-Free 5.0中的Digital-Mars编译器

启用-o(优化)

并得到了结果:

 time of for-loop(cycles)        844
 time of while-loop(cycles)      735
 time of custom-loop-1(cycles)   562
 time of custom-loop-2(cycles)   469
Run Code Online (Sandbox Code Playgroud)

我无法找到Digital-Mars编译器"asm output"选项进行比较.构建选项中没有其他优化选项.我应该改变我的编译器吗?如果是的话,哪一个?你能看一下下面的代码并告诉我为什么自定义循环更快?

这是循环的标准:

t1=clock(); 
for(int i=0;i<200000000;i++)
{
    temp=a;//instruction 1
    a=b;//instruction 2
    b=temp;//3 instructions total   
}   
t2=clock();
printf("\n time of for-loop(increasing) %i  \n",(t2-t1));
Run Code Online (Sandbox Code Playgroud)

这是标准的while循环:

t1=clock();
while(j<200000000)
{
    temp=a;//again it is three instructions
    a=b;
    b=temp; 
            j++;
}
t2=clock();
printf("\n time of while-loop(cycles)  %i  \n",(t2-t1));
Run Code Online (Sandbox Code Playgroud)

这是我的自定义循环1:

t1=clock();
j=200000000;//setting the count
    __asm
    {
        pushf           //backup
        push eax        //backup
        push ebx        //backup
        push ecx …
Run Code Online (Sandbox Code Playgroud)

c++ optimization assembly

1
推荐指数
2
解决办法
735
查看次数

通过完全理解现代 pc 架构,是否有可能获得比编译器更好的性能?

我知道现在很多编译器都非常擅长优化代码。但是,如果一个完全理解现代pc架构的人,是否有可能使代码比编译器更快?比如,如果他用 100% 的汇编编写代码,专注于架构呢?如果它确实有所作为,是否值得?

performance assembly compiler-optimization

1
推荐指数
1
解决办法
178
查看次数

装配能使程序用C写得更快吗?

我正在使用C语言编写程序,并且需要使其显着更快,因为这是对性能的评估.所以我很好奇汇编代码是否可以在任何级别使C程序更快?如果我用汇编代替部分C代码,是否可以缩短程序的运行时间?(例如巨大的循环).

谢谢.

c performance assembly

-1
推荐指数
1
解决办法
795
查看次数