相关疑难解决方法(0)

每个汇编指令需要多少个CPU周期?

我听说有英特尔在线书籍描述了特定汇编指令所需的CPU周期,但我无法找到它(经过努力).有人能告诉我如何找到CPU周期吗?

下面是一个例子,在下面的代码中,mov/lock是1个CPU周期,xchg是3个CPU周期.

// This part is Platform dependent!
#ifdef WIN32
inline int CPP_SpinLock::TestAndSet(int* pTargetAddress, 
                                              int nValue)
{
    __asm
    {
        mov edx, dword ptr [pTargetAddress]
        mov eax, nValue
        lock xchg eax, dword ptr [edx]
    }
    // mov = 1 CPU cycle
    // lock = 1 CPU cycle
    // xchg = 3 CPU cycles
}

#endif // WIN32
Run Code Online (Sandbox Code Playgroud)

顺便说一句:这是我发布的代码的URL:http://www.codeproject.com/KB/threads/spinlocks.aspx

cpu assembly cycle

48
推荐指数
5
解决办法
5万
查看次数

加倍数 - 左移与乘法

有什么区别

int size = (int)((length * 200L) / 100L); // (1)
Run Code Online (Sandbox Code Playgroud)

int size = length << 1; // (2)
Run Code Online (Sandbox Code Playgroud)

(两种情况下长度均为int)

我假设两个代码片段都想要加倍长度参数.

我很想使用(2)......那么使用(1)有什么好处吗?我查看溢出发生时的边缘情况,两个版本似乎都有相同的行为.

请告诉我我错过了什么.

.net c# algorithm

11
推荐指数
5
解决办法
4150
查看次数

x86_64:IMUL快于2x SHL + 2x ADD吗?

/O2(发布)模式下查看由Visual Studio(2015U2)生成的程序集时,我看到这个"手动优化"的C代码被转换回乘法:

int64_t calc(int64_t a) {
  return (a << 6) + (a << 16) - a;
}
Run Code Online (Sandbox Code Playgroud)

部件:

  imul        rdx,qword ptr [a],1003Fh  
Run Code Online (Sandbox Code Playgroud)

所以我想知道这是否真的比按照它的编写方式更快,类似于:

  mov         rbx,qword ptr [a]  
  mov         rax,rbx  
  shl         rax,6  
  mov         rcx,rbx  
  shl         rcx,10h  
  add         rax,rcx  
  sub         rax,rbx  
Run Code Online (Sandbox Code Playgroud)

我总是觉得乘法总是比几个班次/加法慢?现代英特尔x86_64处理器不再是这种情况吗?

performance assembly x86-64 intel multiplication

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

现代 X86 处理器如何实际计算乘法?

我正在看一些关于算法的讲座,教授用乘法作为如何改进朴素算法的例子......

它让我意识到乘法并不是那么明显,虽然在我编码时我只是认为它是一个简单的原子操作,乘法需要一个算法来运行,它不像对数字求和那样工作。

所以我想知道,现代桌面处理器实际使用什么算法?我猜他们不依赖对数表,也不用数以千计的总和进行循环......

algorithm x86 cpu-architecture alu micro-architecture

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

在Python中测量乘法的大O

据我了解,乘法的复杂度顺序是二次的,因此,如果将两个1位数字相乘将有1个运算,两个2位数字相加将有4个运算,两个3位数字9个运算等等上。

我想通过定时执行将两个数字相乘的程序来查看这种复杂性。出乎意料的是,无论数字的大小如何,执行时间都是相同的。

import time

num1 = 135
num2 = 342

start = time.time()
total = num1 * num2
finish = time.time()
elapsed = finish - start

print elapsed
Run Code Online (Sandbox Code Playgroud)

因此,结果是9.53674316406e-07我将两个3位数或两个30位数相乘。

我误会什么?

python math big-o

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