出産前後の痔にはご注意!

データキャッシュ
命令キャッシュ
キャッシュフラッシュ

 この三つの差がよくわかりません。キャッシュはCPUの処理速度を上げるためのものであることは理解しています。私が知っていたのはデータキャッシュのみで、同じデータのやり取りを行う時に使用するものですよね?
 では、命令キャッシュとは、同じ命令を行うときに使用する?いつ、どこで、その命令をキャッシュに入れておくのでしょうか?
 キャッシュフラッシュはなんとなくわかります。キャッシュに格納してある情報を要求先へ送ることですか?

 会社でこの質問に答えれなくて、宿題にされてしまいました・・・・。答えでも、答えでなくてもいいです。情報をいただけたらと思い質問させていただきました。
よろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

プロセッサとメインメモリの処理速度は全然違うので, データが必要なたびにメインメモリにアクセスするのでは実行速度が大幅に低下してしまいます. そのため「メインメモリほど容量はないけどメインメモリより高速なメモリ」を間に入れて実行速度の低下を防ごうというのがキャッシュの主目的です. ここでは「データ」と書きましたが, プログラムの命令そのものもプロセッサから見ればデータの一種ですので, 当然命令に対しても同様に考えることができます. つまり, プロセッサから見ると, メモリアクセスは全てキャッシュに対して行われます.



また, 今のプロセッサは当然のようにパイプライン化されていますので, 命令の読み込み・実行・データのアクセスが全て同時に行われます. そのため, 命令を格納するメモリとデータを格納するメモリが同じバスに接続されていると, やはり実行速度は低下してしまうため, この 2つは異なるバスに接続するハーバードアーキテクチャが使われています. ということで, 「命令に対するキャッシュ」と「データに対するキャッシュ」を分けておくとうのは合理的である, ということになります.

そして, 処理が進んでいくと「キャッシュが全ていっぱいになってしまい, 新たなデータをキャッシュに読み込めなくなる」ことになります. このとき, キャッシュ上のデータを捨てる必要があるのですが, これを「キャッシュのフラッシュ」と呼びます. 命令キャッシュであったり, データキャッシュでもデータを読み込んでいるだけならいいのですが, データを書き込んでいる場合にはキャッシュ上のデータをメインメモリに書き戻す必要がある場合があります. これはデータをメモリに書き込むときに「メインメモリにも同時に書き込む (= write-through)」なら必要ないのですが, 「メインメモリにはあとで書き込む (= write-back)」場合には必須となります. したがって write-back の方がフラッシュの処理が面倒になりますが性能は一般に write-through より高くなります.

なお, #1 でも書かれているようにキャッシュは「アクセスの局所性」に基づいていますので, 分岐命令に対してうまく処理しなければならないという問題点があります (分岐先の命令をキャッシュに入れておかないと実行できないので). 普通は分岐予測というものを使うのですが, SPARC V9 では「絶対分岐しない分岐命令」というおもしろいものを用意してあります. これは命令単独では全く意味を持たないのですが, その副作用として「分岐先アドレスの命令をキャッシュに先読みする*かもしれない*」という機能があったりします.
    • good
    • 1

キャッシュが有効である理由は、いわゆる参照の局所性(Locality of reference)があるからです。



そして、その参照の局所性は、データだけではなく、命令についても言えます。例えば、いかなる言語であっても普通にプログラムを書いた場合、一般的にループはよく現われます。そのプログラムをコンパイルした結果、通常は(つまりリバースエンジニアリングしにくくするためにわざとあっちこっちに飛ぶようなコードがはき出されていたりしない限りは)、そのループ部分の命令は局所的に存在します。よって、最近実行した命令をキャッシュに残しておけば、所定の確率で再度その命令をフェッチすることになります。

また、命令を先読みする場合があります。この場合も、先読みした命令をキャッシュに入れておくことにより、CPUから見た命令転送コストは、トータルとして少なくて済みます。
また、PCに基づいて単純に命令を先読みする場合だけではなく、分岐キャッシュ(分岐命令のアドレスとその分岐先とのアドレスのペアを保持)に基づいて、分岐先を予測して命令を先読みする場合もあります。

なお、キャッシュフラッシュは、キャッシュにおいている情報を捨てることではないでしょうか。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qキャッシュを意識したプログラムのうちかたを教えて

キャッシュを意識した高速なプログラムの打ち方を教えてください。
具体的にどうすればいいのか教えてほしいです。

よろしくおねがいします。

Aベストアンサー

Windows限定と言うか汎用的なx86系CPU限定で良いんでしょうか?
回答番号:No.3さんの回答に似てるんですが、

[命令キャッシュ]
(1)if文のelse/switch等の分岐を避ける。特に大きなコードを含んだ分岐で飛び越すのは避けた方がよい。
(2)処理の回数や時間が長い処理を出来るだけif文の条件が真になる時に通るようにする。
(3)関数やクラスの呼び出しを極力避ける。呼び出す場合は出来るだけ戻ってこない時間の掛かる処理にする。

[データキャッシュ]
(1)データは極力シーケンスにアクセスする。ランダムアクセスする場合も広範囲にアクセスしないように工夫する。
(2)データのアクセスとアクセスは出来るだけ間隔を空けて、レジスタ内で処理をするコードを心がける。
(3)スレッドなどCPUコア間で同期が必要な処理は避ける。データキャッシュのフラッシュが起こる可能性があるため。

上と合わせて、コンパイラ出力のアセンブラレベル命令コードを毎回確認して、無駄なコードが出ていないか確認する。

まぁ、今時のCPUでキャッシュばかり意識し過ぎるとプログラムの可読性が低いやら、結局処理が遅いとか、開発効率が悪すぎるとか、あまりメリットが無いかもしれません。

Windows限定と言うか汎用的なx86系CPU限定で良いんでしょうか?
回答番号:No.3さんの回答に似てるんですが、

[命令キャッシュ]
(1)if文のelse/switch等の分岐を避ける。特に大きなコードを含んだ分岐で飛び越すのは避けた方がよい。
(2)処理の回数や時間が長い処理を出来るだけif文の条件が真になる時に通るようにする。
(3)関数やクラスの呼び出しを極力避ける。呼び出す場合は出来るだけ戻ってこない時間の掛かる処理にする。

[データキャッシュ]
(1)データは極力シーケンスにアクセスする。ラン...続きを読む

Q複数ファイルで使うグローバル変数の位置

メイン関数の処理で、関数A→関数B→関数Cという順序で関数が呼び出される場合(1関数1ファイルとします)、関数A,B,Cすべてで使用するグローバル変数の宣言を関数Bのファイルでおこなって、他のファイルではそれをexternするというのでも問題ないでしょうか?

Aベストアンサー

問題ありません。
が、しかし、そのような方法は、実務レベルの場合は、行いません。
以下のような方法をとります。

ファイル名:xxx_ext.c
変数のみを宣言したファイル。

ファイル名:xxx_ext.h
上記の変数のみを宣言したしものをexternで参照するファイル。

ファイル名:func_a.c
関数Aのファイル。
このファイルで、#include xxx_ext.h する

ファイル名:func_b.c
関数Bのファイル。
このファイルで、#include xxx_ext.h する

ファイル名:func_c.c
関数Cのファイル。
このファイルで、#include xxx_ext.h する

上記のようにすることで、externで参照する変数が1つのファイル内に閉じこめられるのでメンテナンス性がよくなります。たとえば、ある理由があって、変数Xの型をintからdoubleに変えることを想定してください。
xxx_ext.c とxxx_ext.hの2つのファイルのみが変更対象
となります。
上記のようにしない場合は、3つのファイル(あるいはそれ以上)を変えることになります。

問題ありません。
が、しかし、そのような方法は、実務レベルの場合は、行いません。
以下のような方法をとります。

ファイル名:xxx_ext.c
変数のみを宣言したファイル。

ファイル名:xxx_ext.h
上記の変数のみを宣言したしものをexternで参照するファイル。

ファイル名:func_a.c
関数Aのファイル。
このファイルで、#include xxx_ext.h する

ファイル名:func_b.c
関数Bのファイル。
このファイルで、#include xxx_ext.h する

ファイル名:func_c.c
関数Cのファイル。
このファイル...続きを読む

QTera Term の使い方について

お世話になります。
Tera Termの使い方が分からず、ご教授いただけませんでしょうか。
具体的には、下記リンクの画面6のように、
http://www.atmarkit.co.jp/fnetwork/rensai/tcp01/01.html

Tera Termの画面に、
GET http://www.atmarkit.co.jp/fnetwork/accesstest/at.html
を入力し、その結果を表示させたいのですが、画面自体に入力ができないのです。

ご存知の方、アドバイス方、よろしくお願いします。

Aベストアンサー

ringo105さん
>カラ打ちとなり、画面に入力自体ができません

ではカラ打ちのままでいいので、何か適当な文字で
「get dddd」のように打って
リターンキーを押してみても反応はありませんか?

↓下のようになものが返って来たら、NO.2さんのおっしゃるように、
ローカルエコーがオフで表示されてないだけだと思います。

-----------------------------------------------
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>400 Bad Request</TITLE>
</HEAD><BODY>
<H1>Bad Request</H1>
Your browser sent a request that this server could not understand.<P>
Invalid URI in request get dddd<P>
</BODY></HTML>
-----------------------------------------------


@ITのページの説明にあった、
Teraterm.iniの
TCPLocalEcho=on
TCPCRSend=CRLF

をもう一度確認してもみてください。

ringo105さん
>カラ打ちとなり、画面に入力自体ができません

ではカラ打ちのままでいいので、何か適当な文字で
「get dddd」のように打って
リターンキーを押してみても反応はありませんか?

↓下のようになものが返って来たら、NO.2さんのおっしゃるように、
ローカルエコーがオフで表示されてないだけだと思います。

-----------------------------------------------
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>400 Bad Request</TITLE>
</HEAD><BODY>
<H1>Ba...続きを読む

Q命令キャッシュとデータキャッシュ

命令キャッシュとデータキャッシュの違いについて教えてください。
命令キャッシュ=データの更新が少ない
データキャシュ=データの更新が多い
ってとこまではわかったのですが、それ以上はよくわからないのです。
あとなぜ命令キャッシュとデータキャッシュに分ける必要があるのでしょうか?
よろしくお願いします。

Aベストアンサー

命令とデータの間はアクセスするときにまったく相関がありません。

キャッシュはアクセスするときに相関があるデータを読み書きするときに
ヒット率があがるものですから,最初からまったく相関のない
命令とデータを同じキャッシュに入れるということはキャッシュの
ヒット率を下げることは明らかです。

したがって分けているということになります。

Qクロック周波数の計算問題について

クロック周波数に関する問題を解こうとしているのですが、
公式がどうも覚えづらくて仕方ないのですが・・・ 何か良い解き方はないものでしょうか?

【問題】基本情報処理 平成19年 秋
 「 1GHzで動作するCPUがある。このCPUは,機械語の1命令を平均0.8クロックで実行できることが分かっている。このCPUは1秒間に約何万命令実行できるか。 」


【公式】
  (1) 1クロックの時間 = 1÷クロック周波数
  (2) 1命令の実行時間 = 1命令の実行に必要なクロック数×1クロックの時間
  (3) 1秒間の命令実行回数 = 1÷1命令の実行時間(命令)

---------------------------------------------------------------
【考え】
 公式より、
  (3)の答えを出したければ (2)が必要であり
  (2)の答えを出したければ (1)が必要である。
  
 であるから、先に(1)を求め (2)を求め (3)を最終的に求める。
 という風に解いてはいるのですが、教科書を見ながらだと解ける状態ですが、いざ時間を空けると公式を忘れてしまって、この手の問題が解けないことがあり、困っています。

  何か逆算みたいで、覚えづらいので一度覚えてもすぐに忘れしまうのですが・・・
 
  この問題をとく方法としては、一旦、解き方の流れを把握して、求め方を覚えるしかないでしょうか?


【ふとした疑問】
  この問題をしてふと思ったのですが、クロック周波数の計算事態は、実際にどこでどういう場面で使われるものなのでしょうか? 何だか、ただ問題を解いているようで、ちょっとイメージが浮いている感じがしているのです・・・(汗)
  

クロック周波数に関する問題を解こうとしているのですが、
公式がどうも覚えづらくて仕方ないのですが・・・ 何か良い解き方はないものでしょうか?

【問題】基本情報処理 平成19年 秋
 「 1GHzで動作するCPUがある。このCPUは,機械語の1命令を平均0.8クロックで実行できることが分かっている。このCPUは1秒間に約何万命令実行できるか。 」


【公式】
  (1) 1クロックの時間 = 1÷クロック周波数
  (2) 1命令の実行時間 = 1命令の実行に必要なクロック数×1クロックの時間
  (3) 1...続きを読む

Aベストアンサー

単純な問題なので解けた方がいいでしょう。公式で解こうとするから、忘れてしまうとか言っているが、公式の意味を考えた方がいい。
「一箱に1[kg]のひき肉が入っている。ひき肉の一粒が0.8[g]だとすると、一箱の中に何粒のひき肉があるか」という問題と同じだ。こんな問題に公式とか何とか言うか。

【公式】
  (1) 1クロックの時間 = 1÷クロック周波数
  (2) 1命令の実行時間 = 1命令の実行に必要なクロック数×1クロックの時間
  (3) 1秒間の命令実行回数 = 1÷1命令の実行時間(命令)
だね。
(3)に(2)、(1)を代入していけば、
1秒間の命令実行回数 = 1÷1命令の実行時間=1÷(1命令の実行に必要なクロック数×1クロックの時間)=1÷(1命令の実行に必要なクロック数×(1÷クロック周波数))

すなわち、

1秒間の命令実行回数=クロック周波数÷1命令の実行に必要なクロック数

になる。

言葉で書くとわかりにくいので、記号を使うと、

f:クロック周波数
n:1秒間の命令実行回数
t1:1命令の実行時間
c1:1命令の実行に必要なクロック数
t:1クロックの時間


t=1/f・・・(1)
t1=c1*t・・・(2)
n=1/t1・・・(3)
=1/(c1*t)=1/(c1*1/f)=f/c1

ついでに、答えまで書くと、

n=1*10^9/0.8=1.25*10^9

でしょう。

単純な問題なので解けた方がいいでしょう。公式で解こうとするから、忘れてしまうとか言っているが、公式の意味を考えた方がいい。
「一箱に1[kg]のひき肉が入っている。ひき肉の一粒が0.8[g]だとすると、一箱の中に何粒のひき肉があるか」という問題と同じだ。こんな問題に公式とか何とか言うか。

【公式】
  (1) 1クロックの時間 = 1÷クロック周波数
  (2) 1命令の実行時間 = 1命令の実行に必要なクロック数×1クロックの時間
  (3) 1秒間の命令実行回数 = 1÷1命令の実行時間(命令)
だ...続きを読む


人気Q&Aランキング