1

我想知道如何计算 C++ 内联汇编程序的执行时间?我的问题是 Tickcounts 的差异为 0。

这是我的cpp代码:

const int N = 100000;
short x[4*N];

short a[4*N];
    for (int j=0;j<4*N;j++) {
        x[j] = rand() % 1000;
        a[j] = rand() % 5000;
    }
DWORD dwAStart = GetTickCount();

__asm {

    xor eax,eax

        mov ecx,N
    xor esi,esi

一:

        emms
    movq        mm1,qword ptr x[esi]
    movq        mm2,mm1
    punpcklwd   mm1,mm6
    punpckhwd   mm2,mm6
    movq        mm0,qword ptr a[esi]
    movq        mm3,mm0
    punpcklwd   mm0,mm6
    punpckhwd   mm3,mm6
    pmullw      mm0,mm1

    paddsw      mm0,mm3

    add esi , 8
    loop a1
};
DWORD dwAInterval = GetTickCount() - dwAStart;
printf("Operation is completed through %d ms (Assembler)!\n", (int)dwAInterval); 
4

3 回答 3

2

由 计数的滴答声GetTickCount()太粗略,无法从如此短的汇编代码序列中捕获时间差异。您将不得不使用 x86时间戳计数器来查看时间;指令助记符通常RDTSC在汇编中。所有警告都适用,例如:您的进程可能会被中断(这将使计数无效),时钟频率实际上可能会改变,其他内核中的活动可能会影响您的内核的时序,...。

于 2012-12-15T14:49:47.137 回答
2

正如 GregS 所指出的,GetTickCount 过于粗糙,无法用于对短代码序列进行计时。并且在 x86 处理器上发现的时间戳计数器有一些限制,使其在多核处理器上非常不可靠。最可靠的解决方案是QueryPerformanceCounterQueryPerformanceFrequency函数。在 *nix 平台上,POSIX 函数 clock_gettime() 用于类似目的。

于 2012-12-15T16:34:19.297 回答
0

我用了:

#include <iostream>
using namespace std;
typedef std::chrono::high_resolution_clock Clock;
int main()
{
  int X4,sum,avg;
  auto t1 = Clock::now();
  auto t2 = Clock::now();
  sum=avg=0;
  for( int i=0; i<TRIALS; i++ )
    {
      X4=17;
      t1 = Clock::now();
      asm  (
	    "movl %0, %%eax;" // X->ax
	    "movl $0x0A, %%ebx;" // 10->bx
	    "mul %%ebx;" // 10*ax->ax
	    : "=a" (X4)
	    : "a" (X4)
	    : "%ebx"
	    );
      t2 = Clock::now();
      sum+=chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count();
    }
  avg=sum/TRIALS;
  cout << "| Product:  " << X4<< "  "<< avg << " nanoseconds |" << endl;
}

于 2019-02-28T18:59:30.917 回答