5

だから私はアセンブリを教えられており、メモリからの読み取りとキャッシュからの読み取りの時間差を見つけるという課題があります。これを行うには、2つのループを作成し、それらのタイミングを調整します。(1つはメインメモリから読み取り、もう1つはキャッシュから読み取ります)。問題は、キャッシュまたはメインメモリのいずれかから読み取る方法を教えてくれるものが何もわからないことです=/。助けてくれませんか?私はMASM32でこれを行っています。ループの作成方法とほとんどのアセンブリ言語は理解していますが、読み取らせることができません= /


編集:

私は質問があります、私はこれをしました...

mov ecx, 100 ;loop 100 times
xor eax, eax ;set eax to 0
_label:
mov eax, eax ;according to me this is read memory is that good?
dec ecx ;dec loop
jnz _label ;if still not equal to 0 goes again to _label

...それは大丈夫でしょうか?


編集2:

それでは、私は詮索するつもりはありません。あなたの助けに感謝します。これらは私がしなければならない2つのループなので、別の質問があります。どういうわけかそれらを比較する必要があります、私はタイマー命令を探していましたが、私が見つけたものは見つかりませんでした:timeGetTimeGetTickCount、およびパフォーマンスカウンターしかし、私が理解している限り、これらの命令は時間ではなくシステム時間を返しますループが終了するまでにかかります。私がやりたいことを実際に行う方法はありますか?または私は別の方法を考える必要がありますか?

また、2番目のループ(キャッシュから読み取らないレジスタ)で異なるレジスタから読み取るために、さまざまな「mov」命令を与えても大丈夫ですか?それとも私はここで完全にベースから外れていますか?

このすべての質問について申し訳ありませんが、もう一度あなたの助けに感謝します。

4

1 に答える 1

7

キャッシュから読み取る。同じ(または非常に類似した)メモリアドレスから読み取るループがあります。

  • そのアドレスから初めて読み取るときに、そのメモリアドレス(および他の近くのメモリアドレス)からの値がキャッシュに移動されます
  • 次に同じアドレスから読み取るとき値はすでにキャッシュされているため、キャッシュから読み取っています。

キャッシュされていないメモリを読み取るには、非常に異なる(つまり、キャッシュサイズよりも離れた)多くのメモリアドレスから読み取るループを作成します。


2番目の質問に答えるには:

  • ecxとjnzで行っていることは問題ないように見えます(タイマーがどれほど正確で敏感かはわかりませんが、100回以上ループすることをお勧めします)

  • これmov eax, eaxは「メモリの読み取り」ではありません...これは、eaxをeaxに移動するno-opです。代わりに、メモリから読み取るためのMASM構文は、次のようなものだと思いますmov eax,[esi](「アドレスが含まれているメモリ位置から読み取るesi」)

  • 使用しているO/Sに応じて、実際に存在し、読み取り可能なメモリアドレスから読み取る必要があります。たとえば、Windowsでは、アドレス/場所がゼロのメモリをアプリケーションが読み取ることが許可されていないため、アプリケーションのmov esi, 0後に続くことは許可されません。mov eax, [esi]


3番目の質問に答えるには:

timeGetTime、GetTickCount、およびパフォーマンスカウンター

timeGetTime、GetTickCount、およびPerformance Counterについて言及している場合は、Windowsで実行していることを意味します。

はい、これらは現在の時刻をさまざまな解像度/精度に戻します。たとえば、GetTickCountの解像度は約50ミリ秒であるため、50ミリ秒未満のイベントの時間を計ることはできず、50〜100回しか続かないイベントのタイミングは不正確です。ミリ秒。だから私は100あなたの中でecxおそらく十分な大きさではないと言ったのです。

関数はおそらくあなたQueryPerformanceCounterが持っている最も正確なタイマーです。

これらのタイマーのいずれかをインターバルタイマーとして使用するには、次の手順に従います。

  • ループを開始する前に、時間を取ってください
  • ループを終了した後、もう一度時間を取得します
  • これらを2回減算します。違いは時間間隔です

いろいろな「mov」の指示を出しても大丈夫ですか?

はい、そう思います。私はあなたがこのようにそれを行うことができると思います(これが名前のメモリ位置から読み取るための正しいMASM構文であるかどうかわからない/覚えていないことに注意してください)...

mov eax,[memory1]
mov eax,[memory2]
mov eax,[memory3]
mov eax,[memory4]
mov eax,[memory5]

...ここで、memory1throughmemory5は、データセグメント内の間隔の広いグローバル変数のアドレスです。

または、あなたはすることができます...

mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]

...ここで、esiはメモリの長いチャンクの下部を指しており、edxはチャンクの長さの約5分の1に等しい増分です。

于 2009-02-08T00:13:55.883 に答える