1

C ++インラインアセンブラの実行時間をカウントする方法を知りたいですか?私の問題は、ティックカウントの差が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

a1:

        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 プロセッサにあるタイム スタンプ カウンターには制限があり、マルチコア プロセッサでは信頼性が非常に低くなります。最も信頼性の高いソリューションは、QueryPerformanceCounterおよびQueryPerformanceFrequency関数です。*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 に答える