アクセス速度の異なる複数のメモリを有するコンピュータで動作されるプログラムを生成するプログラム生成装置であって、1回目のコンパイル及びリンクによりプログラムを生成し、当該プログラムを前記コンピュータ上で動作させた際のメモリに対するアクセスの監視結果と、前記複数のメモリのアクセス速度を示す情報とに基づいて、頻繁にアクセスされるデータを優先的にアクセス速度が速い方のメモリに配置するようにして、2回目のコンパイル及びリンクによりプログラムを生成することを特徴とするプログラム生成装置。前記複数のメモリは、第1メモリ及びそれよりアクセス速度が速い第2メモリであり、前記コンピュータにて前記1回目のコンパイル及びリンクで生成したプログラムを動作させることで得られた前記監視結果としての、アクセスされた所定範囲のアドレス毎の読み出し回数と書き込み回数を含む第1プロファイルデータを取得し、前記第1メモリ及び前記第2メモリ毎に前記アクセス速度としての読み出し速度と書き込み速度を含む第1メモリデバイス情報を取得し、前記2回目のコンパイル及びリンクによりプログラムを生成する際に、前記アクセスされた所定範囲のアドレス毎に、当該所定範囲のアドレスに配置されていたデータが前記第1メモリに仮に配置された場合に読み出し及び書き込みにかかる第1読み書き合計時間と、当該データが前記第2メモリに仮に配置された場合に読み出し及び書き込みにかかる第2読み書き合計時間とを、前記第1プロファイルデータと前記第1メモリデバイス情報に基づいてそれぞれ算出し、前記アクセスされた所定範囲のアドレス毎に、前記第1読み書き合計時間と前記第2読み書き合計時間との差分を算出し、前記差分が大きいアドレスから順に、当該アドレスに配置されていたデータを前記第2メモリに配置することを特徴とする請求項1記載のプログラム生成装置。前記第1メモリとしてメインメモリ、前記第2メモリとしてキャッシュメモリを有するコンピュータで動作されるプログラムを生成する場合、前記コンピュータにて前記1回目のコンパイル及びリンクで生成したプログラムを動作させることで得られた、アクセスされたアドレス毎の、当該アクセスのサイズ、当該アクセスが読み出しか書き込みかをアクセス順に含む第2プロファイルデータを、前記第1プロファイルデータの代わりに取得し、前記メインメモリの読み出し速度、書き込み速度、及び、前記キャッシュメモリのキャッシュサイズ、キャッシュライン数、キャッシュウェイ数、読み出し速度、書き込み速度を含む第2メモリデバイス情報を、前記第1メモリデバイス情報の代わりに取得し、前記2回目のコンパイル及びリンクによりプログラムを生成する際に、前記第2プロファイルデータを基に前記キャッシュメモリの動作をシミュレートし、キャッシュヒット率が最も低いラインを求め、前記キャッシュヒット率が最も低いラインにキャッシュされるデータのうち、アクセス数が最も多いデータAを前記キャッシュメモリから追い出した回数が最も多いデータBを探し、前記データAと前記データBのキャッシュラインが一致するように、前記データBと前記データAの近傍にある複数のデータとのアドレスの入れ替えをそれぞれ行い、前記キャッシュメモリの動作をシミュレートしながら、前記第2メモリデバイス情報を基に、前記アドレスの入れ替えそれぞれにおけるアクセス時間の総計を計算し、前記アクセス時間の総計が最短となった前記アドレスの入れ替えを採用することを特徴とする請求項2記載のプログラム生成装置。アクセス速度が前記第1メモリよりも速く、前記第2メモリよりも遅い第3メモリをさらに有するコンピュータで動作されるプログラムを生成する場合、前記コンピュータにて前記1回目のコンパイル及びリンクで生成したプログラムを動作させることで得られた、前記第2プロファイルデータを取得し、前記第2メモリアドバイス情報に加えて前記第3メモリの読み出し速度、書き込み速度を含む第3メモリデバイス情報を、前記第2メモリデバイス情報の代わりに取得し、前記2回目のコンパイル及びリンクによりプログラムを生成する際に、前記アクセスされたアドレス毎に、当該アドレスに配置されていたデータが前記第1メモリに仮に配置された場合に読み出し及び書き込みにかかる第1読み書き合計時間と、当該データが前記第3メモリに仮に配置された場合に読み出し及び書き込みにかかる第3読み書き合計時間とを、前記第2プロファイルデータと前記第3メモリデバイス情報に基づいてそれぞれ算出し、前記アクセスされたアドレス毎に、前記第1読み書き合計時間と前記第3読み書き合計時間との差分を算出し、前記差分が大きいアドレスから順に、当該アドレスに配置されていたデータを前記第3メモリに配置するようにし、前記第2プロファイルデータを基に前記キャッシュメモリの動作をシミュレートし、キャッシュヒット率が最も低いラインを求め、前記キャッシュヒット率が最も低いラインにキャッシュされるデータのうち、アクセス数が最も多いデータAを前記キャッシュメモリから追い出した回数が最も多いデータBを探し、前記データAと前記データBのキャッシュラインが一致するように、前記データBと前記データAの近傍にある複数のデータとのアドレスの入れ替えをそれぞれ行い、前記キャッシュメモリの動作をシミュレートしながら、前記第3メモリデバイス情報を基に、前記アドレスの入れ替えそれぞれにおけるアクセス時間の総計を計算し、前記アクセス時間の総計が最短となった前記アドレスの入れ替えを採用することを特徴とする請求項3記載のプログラム生成装置。前記第1メモリと対になる第1プロセッサを備えた第1ノードと、前記第2メモリと対になる第2プロセッサを備えた第2ノードとを有するコンピュータで動作されるプログラムを生成する場合、前記コンピュータにて前記1回目のコンパイル及びリンクで生成したプログラムを前記第1プロセッサ又は前記第2プロセッサにより動作させることで得られた、前記第2プロファイルデータを取得し、前記第1メモリアドバイス情報を取得し、前記2回目のコンパイル及びリンクによりプログラムを生成する際に、前記プログラムが動作するプロセッサを前記第1プロセッサ又は前記第2プロセッサのいずれかに固定し、前記アクセスされたアドレス毎に、当該アドレスに配置されていたデータが前記第1メモリに仮に配置された場合に読み出し及び書き込みにかかる第1読み書き合計時間と、当該データが前記第2メモリに仮に配置された場合に読み出し及び書き込みにかかる第2読み書き合計時間とを、前記第2プロファイルデータと前記第1メモリデバイス情報に基づいてそれぞれ算出し、前記アクセスされたアドレス毎に、前記第1読み書き合計時間と前記第2読み書き合計時間との差分を算出し、前記差分が大きいアドレスから順に、当該アドレスに配置されていたデータを、前記固定されたプロセッサと対になるメモリに配置することを特徴とする請求項2記載のプログラム生成装置。前記コンピュータで動作されるプログラムとして、マルチスレッドプログラムを生成する場合、前記コンピュータにて前記1回目のコンパイル及びリンクで生成したマルチスレッドプログラムを前記第1プロセッサ又は前記第2プロセッサにより動作させることで得られた、アクセスされた所定範囲のアドレス毎の、各スレッドの読み出し回数と書き込み回数を含む第3プロファイルデータを、第2プロファイルデータの代わりに取得し、前記第1メモリアドバイス情報を取得し、前記2回目のコンパイル及びリンクによりプログラムを生成する際に、前記第3プロファイルデータを基に、全てのスレッドからアクセスされている所定範囲のアドレスを特定するとともに、当該全てのスレッドの中で最も読み出し回数と書き込み回数が多いスレッドを特定し、当該特定したスレッドが動作するプロセッサを、前記第1プロセッサ又は前記第2プロセッサのいずれかに固定し、前記第3プロファイルデータを基に、一のスレッドのみからアクセスされている所定範囲のアドレスを特定し、当該一のスレッドが動作するプロセッサを、前記第1プロセッサ又は前記第2プロセッサのいずれかに固定し、前記アクセスされた所定範囲のアドレス毎に、当該所定範囲のアドレスに配置されていたデータが前記第1メモリに仮に配置された場合に読み出し及び書き込みにかかる第1読み書き合計時間と、当該データが前記第2メモリに仮に配置された場合に読み出し及び書き込みにかかる第2読み書き合計時間とを、前記第3プロファイルデータと前記第1メモリデバイス情報に基づいてそれぞれ算出し、前記アクセスされた所定範囲のアドレス毎に、前記第1読み書き合計時間と前記第2読み書き合計時間との差分を算出し、前記差分が大きいアドレスから順に、当該所定範囲のアドレスに配置されていたデータを、前記固定されたプロセッサと対になるメモリに配置することを特徴とする請求項5記載のプログラム生成装置。前記第1ノード及び前記第2ノードのそれぞれにキャッシュメモリをさらに有するコンピュータで動作されるプログラムを生成する場合、請求項4又は5に記載の一連の動作の後で、請求項2に記載の一連の動作を行うことを特徴とする請求項5又は6記載のプログラム生成装置。アクセス速度の異なる複数のメモリを有するコンピュータで動作されるプログラムを生成するプログラム生成方法であって、1回目のコンパイル及びリンクによりプログラムを生成し、当該プログラムを前記コンピュータ上で動作させた際のメモリに対するアクセスの監視結果と、前記複数のメモリのアクセス速度を示す情報とに基づいて、頻繁にアクセスされるデータを優先的にアクセス速度が速い方のメモリに配置するようにして、2回目のコンパイル及びリンクによりプログラムを生成することを特徴とするプログラム生成方法。アクセス速度の異なる複数のメモリを有するコンピュータで動作されるプログラムを生成するプログラムであって、1回目のコンパイル及びリンクによりプログラムを生成する処理と、当該プログラムを前記コンピュータ上で動作させた際のメモリに対するアクセスの監視結果と、前記複数のメモリのアクセス速度を示す情報とに基づいて、頻繁にアクセスされるデータを優先的にアクセス速度が速い方のメモリに配置するようにして、2回目のコンパイル及びリンクによりプログラムを生成する処理と、をコンピュータに実行させることを特徴とするプログラム。しかしながら、上述したプロファイルデータに基づいて望ましい最適化を行いつつコンパイル及びリンクを行ってプログラムを生成する技術では、最適化の範囲が限定されており、メモリアクセスメモリに対するアクセスに関する最適化は行われていなかった。例えば、マルチコアシステムの一形態であるNUMAにおいては、アクセス速度が速いローカルメモリと、アクセス速度が遅いリモートメモリとが存在するが、このアクセス速度の違いを考慮して最適化を行うコンパイラ及びリンカは存在しない。また、キャッシュメモリを有するシステムにおいても、キャッシュメモリとメインメモリとではアクセス速度の違いがあるが、このアクセス速度の違いを考慮して最適化を行うコンパイラ及びリンカは存在しない。このように従来では、コンパイル及びリンクにおいて動的なプロファイルデータを用いた最適化が行われる際に、複数のメモリにおけるアクセス速度の違いを考慮した最適化が行われていなかった。本発明は、上記事情に鑑みてなされたものであり、コンパイル及びリンクによりプログラムを生成する際に、複数のメモリにおけるアクセス速度の違いを考慮した最適化を実現するプログラム生成装置、プログラム生成方法及びプログラムを提供することを目的とする。かかる目的を達成するために、本発明の第1の態様は、アクセス速度の異なる複数のメモリを有するコンピュータで動作されるプログラムを生成するプログラム生成装置であって、1回目のコンパイル及びリンクによりプログラムを生成し、そのプログラムをコンピュータ上で動作させた際のメモリに対するアクセスの監視結果と、複数のメモリのアクセス速度を示す情報とに基づいて、頻繁にアクセスされるデータを優先的にアクセス速度が速い方のメモリに配置するようにして、2回目のコンパイル及びリンクによりプログラムを生成することを特徴とする。本発明の第2の態様は、アクセス速度の異なる複数のメモリを有するコンピュータで動作されるプログラムを生成するプログラム生成方法であって、1回目のコンパイル及びリンクによりプログラムを生成し、プログラムをコンピュータ上で動作させた際のメモリに対するアクセスの監視結果と、複数のメモリのアクセス速度を示す情報とに基づいて、頻繁にアクセスされるデータを優先的にアクセス速度が速い方のメモリに配置するようにして、2回目のコンパイル及びリンクによりプログラムを生成することを特徴とする。本発明の第3の態様は、アクセス速度の異なる複数のメモリを有するコンピュータで動作されるプログラムを生成するプログラムであって、1回目のコンパイル及びリンクによりプログラムを生成する処理と、プログラムをコンピュータ上で動作させた際のメモリに対するアクセスの監視結果と、複数のメモリのアクセス速度を示す情報とに基づいて、頻繁にアクセスされるデータを優先的にアクセス速度が速い方のメモリに配置するようにして、2回目のコンパイル及びリンクによりプログラムを生成する処理と、をコンピュータに実行させることを特徴とする。本発明によれば、コンパイル及びリンクによりプログラムを生成する際に、複数のメモリにおけるアクセス速度の違いを考慮した最適化を実現することによって、生成されるプログラムの更なるパフォーマンス向上を実現できる。以下、本発明を実施するための形態実施形態について添付図面を参照して詳細に説明する。なお、以下に記載する各実施形態の説明はあくまで一例であり、本発明を限定するものではない。第1の実施形態図1は、本実施形態のプログラム生成装置におけるメモリアクセスの最適化の一例の概要について説明する図である。本実施形態のプログラム生成装置は、例えばPCPersonalComputerなどの、コンパイラ及びリンカが動作する情報処理装置、コンピュータである。なお、以下の説明では、コンパイラ及びリンカをまとめてコンパイラリンカと表記し、別体として扱うときはそれぞれコンパイラ、リンカと表記するコンパイル及びリンクについても同様。図1に示すように、本実施形態のプログラム生成装置例えば開発用PCにおいて、コンパイラリンカは、ソースコードを入力として受け取り、通常のコンパイルリンク1回目のコンパイルリンクを行い、一旦プログラムを生成する。上記生成されたプログラムは、動作コンピュータ例えば組み込み用ボード上で動作させられる。このとき、動作コンピュータでは、その動作の際のメモリアクセスについてのプロファイルデータが得られる。プロファイルデータの詳細は後述する。なお、動作コンピュータは、必ずしもプログラム生成装置と別体である必要はなく、プログラム生成装置と同一であってもよい。コンパイラリンカは、動作コンピュータからプロファイルデータを取得する。また、コンパイラリンカは、これから最適化を行って生成するプログラムが実行される情報処理装置に備えられる複数のメモリについてのメモリデバイス情報を取得する。メモリデバイス情報の詳細は後述する。そして、コンパイラリンカは、プロファイルデータ、メモリデバイス情報、ソースコードを入力として受け取り、メモリアクセスが最適に行われるように、再度プログラムの生成を行う。つまり、2回目のコンパイルリンクが行われる。この際、頻繁にアクセスされるデータはアクセス速度が速いメモリに配置されるように決定され、そうでないデータはアクセス速度が速くないメモリに配置されるように決定される。このように本実施形態では、2回目のコンパイルリンクのときにデータの再配置が実行されることで、メモリアクセスの最適化が実現される。上述した本実施形態のプログラム生成装置の概要を整理すると、図2に示すフローチャートの流れとなる。まず、プログラム生成装置において、1回目のコンパイルリンクが行われる。すなわち、コンパイラリンカは、ソースコードを入力として受け取り、通常のコンパイルリンクを行ってプログラムを生成するステップ1。このとき、メモリアクセスの最適化は行われない。すなわちリンカは、メモリアクセスの対象となるデータを適当なアドレスに配置する。なお、ここでいう配置するとは、未確定であったアドレスを確定するという意味である。よって、リンカがデータを所定のアドレスメモリに配置するということは、リンクの実行時に、プログラムが実行された際にデータが所定のアドレスメモリに配置されるように決定するという意味である。この意味は以下の説明においても同様とする。次に、動作コンピュータにおいて、1回目のコンパイルリンクにより生成されたプログラムを動作させ、動作コンピュータ上のメモリプロファイラを使用して実行中のプログラムのメモリアクセスを逐一監視し、ストレージデバイス上のファイルにアクセス記録をログするステップ2。このログが、プロファイルデータとなる。動作コンピュータにおいてプログラムを十分な時間動作させたら、ログを終了させる。次に、プログラム生成装置において、2回目のコンパイルリンクが行われる。まず、コンパイラリンカは、ソースコード、プロファイルデータ及びメモリデバイス情報を入力として受け取るステップ3-1。次に、コンパイラは、ソースコードから、通常のコンパイルを行って、プログラムを生成するステップ3-2。もしも、ステップ1でプログラムを生成した際のオブジェクトファイルがプログラム生成装置上に残っている場合、このステップは省略して構わない。リンカは、ステップ3-2又はステップ1で生成したオブジェクトファイルをベースに最適化を行う。プロファイルデータには、プログラムの動作時にアクセスされたメモリのアドレスとその頻度が含まれている。また、メモリデバイス情報には、動作コンピュータ上に搭載されているメモリデバイス毎に、アドレス範囲、読み出しREAD時のアクセス速度及び書き込みWRITE時のアクセス速度が含まれている。リンカは、これらのプロファイルデータ及びメモリデバイス情報に基づいて、ベースとなるオブジェクトファイル上のデータについて再配置を行うステップ3-3。このとき、頻繁にアクセスされるデータはアクセス速度が速いメモリに配置されるように決定され、そうでないデータはアクセス速度が速くないメモリに配置されるように決定される。このようにして決定された再配置情報に基づき、リンカは、オブジェクトファイルを結合して、プログラムを生成する。なお、通常、アクセス速度が速いメモリは総容量が少ないケースが多いため、全てのデータをアクセス速度が速いメモリ上に配置できるとは限らない。その場合は、アクセス頻度の高いデータから優先的にアクセス速度が速いメモリ上に配置されていくように決定される。ここで、上記図2のステップ2の具体例について図3を用いて説明する。図3は、動作コンピュータ上でプログラムのメモリアクセスを監視する仕組みについて説明する図である。図3に示すように、動作コンピュータには、ハードウェアとして、CPUCentralProcessingUnit、メモリ1第1メモリの一例、メモリ2第2メモリの一例、ストレージデバイスが備えられており、ソフトウェアとして、メモリプロファイラが備えられている。このような構成において、1回目のコンパイルリンクで生成されたプログラムが実行される。その際、プログラムCPUのメモリ1、2に対するアクセスは、メモリプロファイラにより逐次監視され、その監視結果がログとしてストレージデバイスのファイルに蓄えられる。この蓄えられたデータがプロファイルデータである。このプロファイルデータは後に、ストレージデバイスから取り出され、コンパイラリンカへ出力される。なお、本明細書においてプログラムのメモリアクセスとは、CPUが、プログラムを実行する際に、メモリの所定アドレスに配置されたデータプログラム上のデータに対してアクセスすることを意味する。メモリプロファイラは、プログラム中の命令コードを1命令ずつ解釈しながらプログラムを実行するソフトウェアである。このような動作をするソフトウェアは、DBADynamicBinaryAnalysisツールとして知られている技術である。DBAツールは、プログラムの挙動を完全に把握することが可能であり、従ってメモリアクセスに関してもプログラムからの各アクセスについて、完全に掌握することができる。このように、メモリプロファイラは、DBA技術を使用して実現することができる。次に、動作コンピュータにて得られたプロファイルデータの具体例を説明する。図4は、プロファイルデータ第1プロファイルデータの一例の一部の例を示す図である。図4において、各データエントリ項目は、開始アドレス、終端アドレス、読み出し回数、書き込み回数、の4つの情報から成る。図4の例では、1つのエントリがカバーするアドレス範囲開始アドレスから終端アドレスまでは、16バイトである。なお、アドレス範囲は、4バイトでも32バイトでも、あるいは1Kバイトでも構わない。1エントリがカバーするアドレス範囲をあまりに狭くしてしまうと、プロファイルデータのデータ量が多くなってしまうが、2回目のコンパイルリンクにおいて精度よく最適化を行うことができる。逆に、1エントリがカバーするアドレス範囲をあまりに広くしてしまうと、プロファイルデータのデータ量は少なくなるが、2回目のコンパイルリンクにおいてあまり精度の良い最適化は行えない。このようなことから、アドレス範囲はデフォルトとして16バイトに設定しておき、ユーザが必要に応じてメモリプロファイラにおいてその設定を変更できるようにしてもよい。メモリプロファイラは、例えばアドレス0x80000000に配置されたデータに対する読み出しのメモリアクセスを検知したとすると、図4において、開始アドレスが0x80000000のエントリの読み出し回数を1増加させる。また、メモリプロファイラは、例えばアドレス0x80000014に配置されたデータに対する書き込みのアクセスを検知したとすると、図4において、開始アドレスが0x80000010のエントリの書き込み回数を1増加させる。このようにしてプロファイルデータは、図3に示す動作コンピュータ上のストレージデバイス上にファイルとして作成される。その後、プロファイルデータは、ストレージデバイスから取り出され、最適化コンパイルリンク処理、すなわち2回目のコンパイルリンクで使用される。次に、上記プロファイルデータと同様に2回目のコンパイルリンクで使用される、メモリデバイス情報の例について説明する。図5は、メモリデバイス情報第1メモリデバイス情報の一例の一例を示す図である。メモリデバイス情報は、動作コンピュータ上に搭載されているメモリデバイスプログラムが使用可能なメモリデバイスに関する情報であり、動作コンピュータ毎に固有のものである。ユーザは、2回目のコンパイルリンクにより生成されるプログラムを動作させたい動作コンピュータ例えば図1、図3に示すものの仕様書やOSOperatingSystemの仕様書を参照して、メモリデバイス情報を作成しておく。図5において、各データエントリは、メモリデバイス、開始アドレス、終端アドレス、読み出し速度、書き込み速度、の5つの情報から成る。図5では、2つのメモリデバイス例えば図3に示すメモリ1、2を例としている。開始アドレス、終端アドレスの間の領域が、プログラムからアクセスできるメモリ領域である。これらのアドレスが物理アドレスであるか、仮想アドレスであるかは、プログラムが動作するコンピュータのCPUアーキテクチャおよびOSに依存する。仮想アドレスである場合は、アドレスマッピングは基本的にはOSが行うものと想定するが、部分的にプログラムからOSAPIを通じてマッピングさせることも可能である。読み出し速度、書き込み速度は、メモリデバイスに読み出し要求もしくは書き込み要求を発行してから、その要求が完了するまでの時間である。図5では、メモリ2がメモリ1よりもメモリアクセスが速い例としている。なお、図5では、メモリ1、2のそれぞれにおいて、読み出し速度と書き込み速度を同じ値としたが、異なる値であってもよい。次に、上記図2のステップ3-3の具体例について図6を用いて説明する。図6は、リンカがデータの再配置を行うときに用いる表の一例を示す図である。リンカは、ステップ3-3におけるデータの再配置を行うにあたり、まず、図2のステップ3-1にて入力されたプロファイルデータ例えば図4に示すもの及びメモリデバイス情報例えば図5に示すものから、図6に示す表を作成する。例えば、図4に示すプロファイルデータから、開始アドレス0x80000000~終端アドレス0x80000010のエントリの読み出し回数が280204回、書き込み回数が5439回という情報が得られたとする。また、図5に示すメモリデバイス情報から、メモリ1の読み込み時間が200ns、書き込み時間が200ns、メモリ2の読み込み時間が10ns、書き込み時間が10nsという情報が得られたとする。このときリンカは、アドレス範囲0x80000000~0x80000010に置かれていたデータを仮にメモリ1に配置した場合と仮にメモリ2に配置した場合のそれぞれにおける、読み出し及び書き込みにかかる合計時間読み書き合計時間の算出を行う。仮にデータをメモリ1に配置したとするならば、280204×2005439×200により、読み書き合計時間は57128600nsとなる。また、仮にデータをメモリ2に配置したとするならば、280204×105439×10により、読み書き合計時間は2856430nsとなる。よって、リンカは、図6に示すように、0x80000000~0x80000010のエントリにおいて読み書き合計時間57128600nsと2856430nsを記録する。このようにして、リンカは、プロファイルデータに記載されている全てのアドレス範囲に対して、メモリ1に配置された場合、メモリ2に配置された場合の各々の読み書き合計時間を算出し、図6に示すように記録していく。次に、リンカは、アドレス範囲のエントリ毎に、メモリ1に配置した場合とメモリ2に配置した場合の読み書き合計時間の差分を計算していく。例えば0x80000000~0x80000010のエントリの場合、57128600-2856430により、差分は54272170nsとなる。そして、リンカは、算出した差分の値が大きい順に、アクセス速度の速いメモリ2にデータを配置していく。例えば、0x80000000~0x80000010における差分が他よりも大きいために、リンカが、0x80000000~0x80000010に置かれていたデータをメモリ2に配置することを決定した場合、実際の配置アドレスを、図5に示されているメモリ2の開始アドレス0x84000000~終端アドレス0x84008000の間のアドレスになるように再配置を行う。容量の問題でメモリ2に配置できなくなったら、リンカは、残りのデータをメモリ1に配置するようにする。このようにリンカが、図6の表に基づいてデータを再配置していき、プログラムを生成する。このようにして生成されたプログラムは、メモリアクセス時間が最短となる最適化されたプログラムとなる。以上説明したように、本実施形態によれば、コンパイル及びリンクによりプログラムを生成する際に、複数のメモリにおけるアクセス速度の違いを考慮した最適化を実現できる。その結果、生成されるプログラムの更なるパフォーマンス向上を実現できる。第2の実施形態本実施形態では、速度差の異なるキャッシュメモリとメインメモリを備えたコンピュータでの動作を想定したプログラムを生成する場合に、キャッシュメモリのヒット率を向上させるメモリアクセスの最適化を実現する例について説明する。プログラム生成装置は、まず1回目のコンパイルリンクを行う。つまり、コンパイラリンカは、第1の実施形態における図2のステップ1と同様に、ソースコードを入力として受け取り、通常のコンパイルリンクメモリアクセスの最適化は行わないを行ってプログラムを生成する。上記生成されたプログラムは、第1の実施形態における図2のステップ2と同様に、動作コンピュータにおいて実行され、メモリプロファイラによってメモリアクセス読み出し、書き込みを監視され、ログとしてプロファイルデータが取得される。本実施形態における動作コンピュータの構成は、図3において、メモリ1がRAMRandomAccessMemory。メインメモリの一例、メモリ2がキャッシュメモリとなる。高速なキャッシュメモリは、アドレス空間にマップされることなく、低速なRAMの一部をコピーとして保持し、メモリアクセスを高速化させる。そして、プログラム生成装置は、2回目のコンパイルリンクを行う。つまり、コンパイラは、第1の実施形態における図2のステップ3-1、3-2と同様に、上記プロファイルデータと、ユーザにより予め作成されたメモリデバイス情報とを入力として受け取り、通常のコンパイルを行い、オブジェクトファイルを生成する上述したように、前に生成したオブジェクトファイルがある場合、この動作は省略されてもよい。その後、プログラム生成装置は、リンカによりキャッシュメモリのヒット率を向上させるためのメモリアクセスの最適化を行うことになるが、ここで、本実施形態におけるプロファイルデータ及びメモリデバイス情報の具体例について以下にそれぞれ説明する。まず、図7を用いてプロファイルデータ第2プロファイルデータの一例の例について説明する。図7は、アドレス空間において、1回目のコンパイルリンクで生成されたプログラムCPUがどのような順序で、どのようなアドレスにアクセスを行ったかについて、メモリプロファイラが記録した例を示している。動作コンピュータにおいて1回目のコンパイルリンクで生成されたプログラムの動作が開始されると、メモリプロファイラは、そのプログラムの実行によるメモリアクセスを監視する。そして、メモリプロファイラは、メモリアクセスを検知すると、アクセス先のアドレスアクセスアドレス、アクセスのサイズアクセスサイズ、アクセスが読み出しであるか書き込みであるかREAD/WRITEを、時系列に逐次記録する。ここで、アクセスされたアドレスは実際にはRAMかキャッシュメモリになるわけであるが、メモリプロファイラは、それを関知せず、アクセスアドレス、アクセスサイズ、READ/WRITEのみを記録する。図7の例では、最初にアドレス0x8049000に4バイトのサイズで読み出しアクセスがあり、次にアドレス0x8049020に2バイトの読み出しアクセスがあったことが記録されている。このように、実行されたメモリアクセスは、順次記録されていく。キャッシュメモリのヒット率を向上させるためのメモリアクセスの最適化には、図7に示すプロファイルデータが必要となる。なお、第1の実施形態における図4のプロファイルデータと、本実施形態における図7のプロファイルデータは、どちらもメモリプロファイラが取得したデータであるが、性格がかなり異なる。図4では、アドレス範囲毎の読み書き総数が記録されているが、読み書きの順番は記録されていない。一方、図7では、読み書きの順番を記録すべく、読み書き毎に逐一記録を行っている。すなわち、1つのメモリアクセスにつき記録が1行増えることになる。よって、図7は、図4に比べて、データ量が膨大になる。このようなことから、動作コンピュータ上のストレージデバイスでは容量が不足するおそれもある。よって、図7のプロファイルデータは、動作コンピュータの外部のストレージデバイスに蓄えられるようにしてもよい。次に、図8を用いてメモリデバイス情報第2メモリデバイス情報の一例の例について説明する。図8に示すメモリデバイス情報も、第1の実施形態における図5のメモリデバイス情報と同様にして、ユーザにより予め作成される。図8に示すように、本実施形態におけるメモリデバイス情報は、メモリデバイス毎に、開始アドレス、終端アドレス、キャッシュサイズ、キャッシュライン数、キャッシュウェイ数、読み出し速度、書き込み速度の情報を持つ。図8において、RAMは、キャッシュサイズ、キャッシュライン数、キャッシュウェイ数の情報は持たない。読み出し速度は、キャッシュメモリ上にキャッシュライン単位でRAMからリフィルされる時の速度である。書き込み速度は、キャッシュメモリ上からキャッシュライン単位でRAMへ書き出される時の速度である。図8において、キャッシュメモリは、開始アドレス、終端アドレスの情報は持たない。キャッシュサイズは、キャッシュメモリ全体の容量である。このキャッシュサイズをキャッシュライン数で割った値が、1つのキャッシュラインのサイズとなる。図8の例では、16KB/512=32バイトが1つのキャッシュラインのサイズになる。読み出し速度は、書き込み速度は、キャッシュヒットした場合の読み書きの速度である。ここで、図8に示すキャッシュウェイ数について以下に説明する。キャッシュは、メモリアクセスが行われる際に、アドレスからタグと呼ばれる情報を生成して、アドレスがどのキャッシュラインに対応するかを判別する。タグは、キャッシュヒットかキャッシュミスかを高速に判別する目的で使用され、アドレスから一意に決まる。例えば、アドレスと0xF0のマスクを以てタグとする。タグに一致するキャッシュラインに紐付けされているアドレスが、アクセスアドレスと一致すればキャッシュヒットとなる一方で、アクセスアドレスと一致しなければキャッシュミスとなる。キャッシュミスの場合は、キャッシュライン上にあるデータをRAMに戻しキャッシュラインから追い出して、新しいアクセスに対応してRAMからデータを読み出して、そのデータをキャッシュラインにフィルする。キャッシュミスはパフォーマンス上のペナルティになるので、できるだけキャッシュミスが起こらないような方式が考案されている。例えば、1つのタグで複数のキャッシュラインを持たせる方式が考案されており、nウェイセットアソシアティブ方式と呼ばれている。このnウェイセットアソシアティブ方式では、タグが一致するキャッシュラインが、n個同時に存在できる。キャッシュヒットキャッシュミスは、タグに一致するキャッシュラインをウェイごとに調べ、キャッシュラインに紐付されたアドレスとアクセスアドレスが一致するかどうかを、最大n回比較する。このように、同一タグで複数のキャッシュラインを持つとき、その数をキャッシュウェイ数と言う。以上説明した図7のプロファイルデータ及び図8のメモリデバイス情報を使用することで、リンカは、キャッシュメモリのヒット率を向上させるためのメモリアクセス最適化を行う。この概要について以下に説明する。リンカは、プロファイルデータ及びメモリデバイス情報から、メモリアクセスにかかった総計時間メモリアクセス総計時間を算出する。この算出は、キャッシュサイズ、キャッシュライン数、キャッシュウェイ数を考慮してキャッシュの動作をシミュレートすることによって可能である。この際、リンカは、ライン毎のキャッシュヒット率も算出しておく。キャッシュヒット率とは、メモリアクセスが行われた際に、データがキャッシュメモリ上にあった場合の割合である。なお、メモリアクセス総計時間が最短となるように理論的に最適化するのは非常に困難であるので、データのアドレス配置を入れ替えながら試行し、メモリアクセス総計時間が最短となるようなアドレス配置を探していく手法をとることが好ましい。ここで、上述した概要の具体例について図9を用いて説明する。図9は、リンカによって行われる、キャッシュメモリのヒット率を向上させるためのメモリアクセス最適化の動作例の一例を示すフローチャートである。図9に示すフローは、図2においてステップ3-3の代わりに行われる。リンカは、まず、プロファイルデータを基に、キャッシュメモリの動作をシミュレートし、キャッシュヒット率が最も低いラインを求めるS11。このステップの例として、図7のプロファイルデータを用いた、キャッシュメモリ動作のシミュレートについて以下に説明する。ここで、タグはアドレスと0xF0のマスクで求められるとし、キャッシュラインサイズを16バイトとする。リンカは、0x8049000のタグ0x00のウェイ0ウェイ3に、0x8049000がヒットするか確認する。ヒットしなければ、リンカは、ウェイ0ウェイ3が空いているか確認する。初めてのメモリアクセスなので、ヒットはせず、ウェイはすべて空いており、リンカは、タグ0x00のウェイ0に0x8049000を紐付する。このアクセスはキャッシュミスとして記録される。リンカは、0x8049020のタグ0x20のウェイ0ウェイ3に、0x8049020がヒットするか確認する。ヒットしなければ、リンカは、ウェイ0ウェイ3が空いているか確認する。タグ0x20のウェイはすべて空いており、リンカは、ウェイ0に0x8049020を紐付する。このアクセスはキャッシュミスとして記録される。リンカは、0x8050048のタグ0x40のウェイ0ウェイ3に、0x8050048がヒットするか確認する。ヒットしなければ、リンカは、ウェイ0ウェイ3が空いているか確認する。タグ0x40のウェイはすべて空いており、リンカは、ウェイ0に0x80500400x8050048が入るキャッシュラインの先頭アドレスを紐付する。このアクセスはキャッシュミスとして記録される。リンカは、0x8049424のタグ0x20のウェイ0ウェイ3に、0x8049424がヒットするか確認する。ヒットしなければ、リンカは、ウェイ0ウェイ3が空いているか確認する。タグ0x20はウェイ0が0x8049020に紐付けられて使用中であり、ウェイ1ウェイ3が空いているため、リンカは、ウェイ1に0x8049420を紐付する。このアクセスはキャッシュミスとして記録される。リンカは、0x8050120のタグ0x20がウェイ0ウェイ3にヒットするか確認する。ヒットしなければ、リンカは、ウェイ0ウェイ3が空いているか確認する。タグ0x20はウェイ0、ウェイ1が使用中であり、残りのウェイは空いているため、リンカは、ウェイ2に0x8050120を紐付する。このアクセスはキャッシュミスとして記録される。リンカは、0x8050121のタグ0x20がウェイ0ウェイ3にヒットするか確認する。ウェイ2にヒットするので、キャッシュヒットである。この場合は、紐付に関しては、リンカは、何もしない。このアクセスはキャッシュヒットとして記録される。このようにリンカは、1アクセス毎に、タグを生成し、キャッシュにヒットするかどうか、ヒットしないならばウェイが空いているかどうか、逐一調べていく。この後、同様にアクセスを追跡していくと、キャッシュヒット、キャッシュミスが起こる。ウェイ0ウェイ3がすべて紐付されている状態でキャッシュミスが起こると、ウェイ0ウェイ3のいずれかがRAMに戻され、キャッシュラインから追い出される。このように、メモリアクセスを順に追っていくことによって、キャッシュヒット、キャッシュミスをシミュレートすることができる。以上のシミュレートを図7に示される全アクセスに対して行うと、キャッシュライン毎のキャッシュヒット率が求められる。また、リンカは、どのデータがどのアドレスに配置されるかを知っているので、どのデータが何回キャッシュヒットしたか、何回キャッシュミスしたか、どのデータアクセスによってキャッシュから追い出されたかを知ることができる。また、図8を用いることによって、アクセス時間の総計メモリアクセス総計時間も算出することができる。次に、リンカは、キャッシュヒット率が最も低いラインにキャッシュされるデータのうち、アクセス数が最も多いデータAをキャッシュから追い出した回数が最も多いデータBを探すS12。リンカは、上述したようにどのデータがどのアドレスに配置されるかを知っているので、S11で求めたキャッシュヒット率が最も低いキャッシュラインに属するデータはどれなのかを、知ることができる。そして、リンカは、それら複数のデータのうち、アクセス数が最も多いデータをデータAとして特定する。リンカは、上述したようにどのデータアクセスによってキャッシュから追い出されたかを知ることができるので、特定したデータAがどのアクセスにより最もキャッシュから追い出されたかを知ることができる。よって、リンカは、データAをキャッシュから追い出した回数の最も多いアクセスによるデータをデータBとして特定する。次に、リンカは、データBのアドレス配置を、データAの近傍のデータと入れ替え、データAとデータBが同一キャッシュ上に載るようにするS13。ここでいうデータAの近傍のデータとは、データAが配置されたアドレスの近傍にあるアドレスに配置されたデータのことである。また、ここでいう同一キャッシュ上に載るとは、キャッシュラインが一致することである。タグは一致するが、アドレスが一致しない場合、キャッシュラインが追い出される可能性がある。同じキャッシュライン上にデータA、データBが存在すれば、お互いを追い出してしまうことはない。例えば、キャッシュラインサイズが16バイトの時、データAのアドレスが0x8049000で、データBのアドレスが0x8049004であれば、データAとデータBは同一キャッシュライン上に存在する。このような状態を同一キャッシュ上に載るという。次に、リンカは、キャッシュメモリの動作をシミュレートしながら、新しいデータ配置でのアクセス時間の総計メモリアクセス総計時間を計算し、それと同時にライン毎のキャッシュヒット率も計算しておくS14。ここでのシミュレートは、上述したS11の方法と同様である。また、メモリアクセス総計時間の計算には、図8のメモリデバイス情報が用いられる。また、ここでいう新しいデータ配置とは、S13で行ったデータBのアドレス配置をデータAの近傍に入れ替えた状態である。ここで、S14におけるメモリアクセス総計時間の計算について説明する。リンカは、キャッシュヒットをシミュレートし、アクセス毎にキャッシュヒットかキャッシュミスかを判定し、その都度アクセスにかかる時間を加算していく。1アクセスにつき、以下の時間がかかる。なお、以下の各時間は、図8に示す読み出し速度及び書き込み速度を基に算出される。読み出しキャッシュヒット⇒キャッシュメモリの読み出し時間書き込みキャッシュヒット⇒キャッシュメモリの書き込み時間読み出しキャッシュミス⇒RAMの読み出し時間書き込みキャッシュミス⇒RAMの書き込み時間図7のプロファイルデータには全てのアクセスについて読み出しアクセスなのか、書き込みアクセスなのかが記録されており、また、上記キャッシュメモリ動作のシミュレートではキャッシュヒット/キャッシュミスの判別がつくので、上記アクセスにかかる時間を加算していけば、リンカは、全てのアクセスに要した時間、すなわちメモリアクセス総計時間を算出することができる。なお、S14におけるライン毎のキャッシュヒット率の計算は、上述したS11の方法と同様のキャッシュメモリ動作のシミュレートによって実現される。ここでの計算結果は、このS14以降において再度S12に戻った場合に、キャッシュヒット率が最も低いラインの特定に用いられる。次に、リンカは、データAの近傍で入れ替えを試していない箇所がないかを判断するS15。ここでいう近傍とは、データAと同一キャッシュラインに載る範囲である。例えば、データA、データBの大きさを4バイト、キャッシュラインサイズを16バイトとすると、データAの近傍は12バイト分になる。よって、データBの置き換え入れ替えは、3回行われる。すなわち、図9において、S15/NO~S13~S14というループが3回行われることになる。例として、データAの近傍の12バイトを4バイトずつ、仮にA2、A3、A4とした場合、リンカは、A2とBを置き換えてキャッシュシミュレートを行い、キャッシュヒット率及びメモリアクセス総計時間を算出する。次に、リンカは、A3とBを置き換えて同様にキャッシュシミュレートを行い、キャッシュヒット率及びメモリアクセス総計時間を算出する。最後に、リンカは、A4とBを置き換えて同様にキャッシュシミュレートを行い、キャッシュヒット率及びメモリアクセス総計時間を算出する。この最後の計算が終わると、リンカは、データAの近傍で全ての入れ替えを試したと判断するS15/YES。次に、リンカは、アクセス時間最短となった時の、データBとデータAの近傍とのアドレス入れ替えを採用するS16。すなわち、リンカは、データBを、データAの近傍のアドレスアクセス時間が最短となったものに配置するようにし、かつ、そのデータAの近傍のアドレスに配置されていたデータを、データBが配置されていたアドレスに配置するようにする。例えば、上記S15で例示したように、データAの近傍がA2、A3、A4であり、それらA2、A3、A4とBとを置き換えてメモリアクセス総計時間をそれぞれ算出した場合、リンカは、置き換えを行わなかった場合のメモリアクセス総計時間と、置き換えを行ってシミュレートした3回それぞれのメモリアクセス総計時間とを比較し、メモリアクセス総計時間が最も短くなる置き換え方法を採用する。つまり、リンカは、A2とBの置き換え、A3とBの置き換え、A4とBの置き換えのうち、メモリアクセス総計時間が最も短くなる置き換えを採用する。リンカは、S16による置き換え入れ替えの結果、メモリアクセス総計時間が短縮したかを判断するS17。メモリアクセス総計時間が短縮しなかった場合置き換えた方が逆にメモリアクセス総計時間が長くなってしまった場合S17/NO、一連のステップを終了する。メモリアクセス総計時間が短縮した場合S17/YES、リンカは、キャッシュヒット率が最も低いラインは、データAが載っているラインとは異なるラインになったかを判断するS18。キャッシュヒット率が最も低いキャッシュラインが変わらない場合はS18/NO、一連のステップを終了する。キャッシュヒット率が最も低いキャッシュラインが変わった場合はS18/YES、リンカは、S12以降のステップを、予め定められた所定回数繰り返したかどうかを判断するS19。リンカは、S12以降のステップを所定回数繰り返したらS19/YES、一連のステップを終了する。上述した図9のフローに従えば、メモリアクセス総計時間の短縮が見込まれる。データのアドレス入れ替え試行数が多ければ多いほど、より短いアクセス総計時間が見つかる可能性が高いが、上記説明では実装し易い単純な例を示した。以上説明したように、本実施形態によれば、コンパイル及びリンクによりプログラムを生成する際に、キャッシュメモリとメインメモリにおけるアクセス速度の違いを考慮した最適化を実現できる。その結果、キャッシュヒット率を向上させ、生成されるプログラムの更なるパフォーマンス向上を実現できる。第3の実施形態上記第2の実施形態では、アクセス速度の異なるキャッシュメモリとメインメモリとしてのRAMを備えた動作コンピュータでの動作を想定したプログラムを生成する場合について説明した。本実施形態では、キャッシュメモリとRAMの他に、SRAMStaticRAM。第3メモリの一例を追加した動作コンピュータでの動作を想定したプログラムを生成する場合について説明する。アクセス速度は、キャッシュメモリが最も速く、その次にSRAMが速く、RAMが最も遅いとする。本実施形態におけるプログラム生成の際のメモリアクセスの最適化の概要について説明する。SRAMはキャッシュメモリと違い、プログラム空間にマップされ自由にデータを配置できる。そこでまず、アクセス頻度アクセス回数の高いデータを、頻度の高い順にSRAMに配置するよう、再配置を行う。その上で、上述の第2の実施形態で説明した図9のフローを行うようにする。これにより、キャッシュメモリとRAMの他にSRAMを備えた動作コンピュータでの動作を想定したプログラムを生成する際にメモリアクセスの最適化を行うことができる。上記概要について具体例を用いて説明する。本実施形態ではまず、上記第1の実施形態で説明した図2のステップ1~3-2までが行われる。なお、ステップ3-1において、プロファイルデータは例えば図7に示すものとし、メモリデバイス情報は例えば図5に示すもの及び図8に示すものの両方とする。そして、ステップ3-2の後、リンカは、ステップ3-3の代わりとして、以下の動作を行う。なお、本実施形態でのメモリデバイス情報については、説明の便宜上図5と図8を分けて説明するが、それら両方を統合したものであってもよい。また、本実施形態でのメモリデバイス情報第3メモリデバイス情報の一例は、図5及び図8において、メモリデバイスの欄にSRAMが追加され、そのSRAMについて各種情報開始アドレス、終端アドレス、読み出し速度、書き込み速度が追加されているとする。まず、リンカは、全てのデータがどのアドレスに配置されるかを知っているので、図7のプロファイルデータの1行1行において、どのデータに対するアクセスが行われたかを知ることができる。そのようにして図7のプロファイルデータを全て調べることにより、リンカは、データ毎のアクセス頻度を知ることができる。よって、リンカは、アクセス頻度の高いデータを特定できる。次に、リンカは、図7のプロファイルデータ及び図5のメモリデバイス情報を基に、上記第1の実施形態において図6を用いて説明した動作を行う。この動作において、リンカはまず、図7に示すデータアクセスアドレス毎に、読み出し回数及び書き込み回数を集計する。次にリンカは、その集計の結果と図5に示される読み出し速度及び書き込み速度を基に、図7に示すデータ毎に、そのデータが仮にRAMに配置された場合と仮にSRAMに配置された場合それぞれの読み書き合計時間を算出する。この算出には、図5の読み出し速度、書き込み速度が用いられる読み書き合計時間=読み出し回数×読み出し速度書き込み回数×書き込み速度。次にリンカは、図7に示すデータ毎に、算出した2つの読み書き合計時間仮にRAMに配置された場合の読み書き合計時間と仮にSRAMに配置された場合の読み書き合計時間の差を算出する。そして、リンカは、図7に示すデータのうち、差が大きいデータから順にSRAMに配置するようにする。このようにして、アクセス頻度の高いデータを、頻度の高い順にSRAMに配置する再配置が行われる。なお、SRAMに配置されなかったデータは、RAMに配置される。次に、リンカは、上記再配置後の全てのデータ、すなわちSRAMに配置するようにしたデータ及びRAMに配置するようにしたデータの両方を対象に、上記第2の実施形態で説明した図9のフローを行う。なお、図9のフローを行う対象を全てのデータとする理由は、キャッシュメモリは、アクセスが、RAMに対するものであろうが、SRAMに対するものであろうが、分け隔てなくキャッシュヒット、キャッシュミスの処理を行う為である。図9のフローは、上記第2の実施形態で説明したのと同様に行われる。ただし、S14においてアクセス時間の総計を計算する際には、キャッシュメモリ、SRAM、RAMそれぞれについての算出が必要となる。そのため、その算出に用いられる図8のメモリデバイス情報には、SRAMについての情報少なくとも読み出し速度及び書き込み速度を含むが追加されている必要がある。以上説明したように、本実施形態によれば、コンパイル及びリンクによりプログラムを生成する際に、キャッシュメモリ、メインメモリ及びSRAMにおけるアクセス速度の違いを考慮した最適化を実現できる。その結果、SRAMの有効利用及びキャッシュヒット率の向上によって、生成されるプログラムの更なるパフォーマンスの向上を実現できる。なお、本実施形態では、データの再配置を行うにあたり、図7のプロファイルデータを用いるものとしたが、図4を用いるようにしてもよい。ただし、図4はアドレス範囲毎のアクセス回数を記録したものであるので、図4を用いる場合は、図7を用いたときの1バイト/2バイト/4バイト単位での再配置ではなく、16バイト単位での再配置となる。また、図4を用いる場合、データ毎のアクセス頻度は特定できないため、リンカは、図4に示すアドレス範囲毎に、読み出し回数及び書き込み回数を集計したり、所定のアドレス範囲に置かれていたデータが仮にRAMに配置された場合と仮にSRAMに配置された場合それぞれの読み書き合計時間を算出したりするこの点は第1の実施形態と同様。第4の実施形態本実施形態では、NUMANonUniformMemoryAccessを採用したコンピュータでの動作を想定したプログラムを生成する場合について説明する。図10にNUMAの構成例を示す。図10のように、NUMAにおいては、CPUとメモリの対から成るノードが複数存在する。図10の例では、ノード1第1ノードの一例、ノード2第2ノードの一例のそれぞれにおいて、メモリ1とCPU1第1プロセッサの一例とが対、メモリ2とCPU2第2プロセッサの一例とが対となっている。あるCPUから見た場合、同じノードにあるメモリは速くアクセスできるが、他のノードにあるメモリへのアクセスは遅い。まず本実施形態の概要について説明する。NUMA環境においてメモリアクセスを最適化するために、本実施形態では、プログラムが動作するCPUを固定した上で、頻繁にアクセスされるデータは、そのプログラムが動作しているのと同じノードのメモリに配置するようにする。CPUを固定しないとすると、他のノード上のCPUで動作してしまう可能性があり、この場合は逆にメモリアクセスが遅くなってしまう。そのため、NUMA環境における最適化は、プログラムが動作するCPUを固定する。例えば、プログラムが動作するCPUをノード1のCPUに固定し、頻繁にアクセスされるデータはメモリ1に配置し、そうではないデータはメモリ2に配置するようにする。上記概要について具体例を用いて説明する。本実施形態ではまず、上記第1の実施形態で説明した図2のステップ1~3-2までが行われる。なお、ステップ1の1回目のコンパイルリンクのときは、特にプログラムを実行するCPUを固定しない。よって、ステップ2で1回目のコンパイルリンクで生成されたプログラムは、図10に示すNUMAを採用した動作コンピュータにおいて、CPUを固定されないまま実行、動作される。また、ステップ3-1において、プロファイルデータは例えば図7に示すものとし、メモリデバイス情報は例えば図5に示すものとする。また、ステップ3-2において、コンパイラは、プログラムが動作するCPUが実行中に変わらないようにするために、CPUの固定を行う。すなわちコンパイラは、複数あるCPUのうちいずれかを選択し、プログラムの先頭において、選択したCPUを固定する専用命令を発行するようにした上でコンパイルを行い、リンカに渡す。これにより、リンカは、メモリ1又はメモリ2のどちらが、コンパイラにより固定されたCPUと同じノードにあるメモリであるかを知ることができる。そして、ステップ3-2の後、リンカは、ステップ3-3の代わりとして、以下の動作を行う。基本的には、上記第3の実施形態と同様である。まず、リンカは、全てのデータがどのアドレスに配置されるかを知っているので、図7のプロファイルデータの1行1行において、どのデータに対するアクセスが行われたかを知ることができる。そのようにして図7のプロファイルデータを全て調べることにより、リンカは、データ毎のアクセス頻度を知ることができる。よって、リンカは、アクセス頻度の高いデータを特定できる。次に、リンカは、図7のプロファイルデータ及び図5のメモリデバイス情報を基に、上記第1の実施形態において図6を用いて説明した動作を行う。この動作において、リンカはまず、図7に示すデータアクセスアドレス毎に、読み出し回数及び書き込み回数を集計する。次にリンカは、その集計の結果と図5に示される読み出し速度及び書き込み速度を基に、図7に示すデータ毎に、そのデータが仮にメモリ1に配置された場合と仮にメモリ2に配置された場合それぞれの読み書き合計時間を算出する。この算出には、図5の読み出し速度、書き込み速度が用いられる読み書き合計時間=読み出し回数×読み出し速度書き込み回数×書き込み速度。次にリンカは、図7に示すデータ毎に、算出した2つの読み書き合計時間仮にメモリ1に配置された場合の読み書き合計時間と仮にメモリ2に配置された場合の読み書き合計時間の差を算出する。そして、リンカは、図7に示すデータのうち、差が大きいデータから順に、コンパイラにより固定されたCPUと同じノードにあるメモリ同一ノードにおいて、固定されたCPUと対となっているメモリに配置するようにする。メモリ1又はメモリ2のどちらが、コンパイラにより固定されたCPUと同じノードにあるメモリであるかは、リンカが、コンパイラにより発行された専用命令を参照することで認識できる。このようにして、アクセス頻度の高いデータを、頻度の高い順に、プログラムが実行されるノードのメモリに配置する再配置が行われる。なお、プログラムが実行されるノードのメモリに配置されなかったデータは、別のノードのメモリに配置される。以上説明したように、本実施形態によれば、コンパイル及びリンクによりプログラムを生成する際に、NUMAにおける複数のメモリのアクセス速度の違いを考慮した最適化を実現できる。その結果、生成されるプログラムの更なるパフォーマンスの向上を実現できる。なお、本実施形態では、データの再配置を行うにあたり、図7のプロファイルデータを用いるものとしたが、図4を用いるようにしてもよい。図4を用いる場合、リンカは、図4に示すアドレス範囲毎に、読み出し回数及び書き込み回数を集計したり、所定のアドレス範囲に置かれていたデータが仮にメモリ1に配置された場合と仮にメモリ2に配置された場合それぞれの読み書き合計時間を算出したりするこの点は第1の実施形態と同様。第5の実施形態本実施形態では、NUMAを採用したコンピュータでの動作を想定したプログラムとして、マルチスレッドプログラムを生成する場合について説明する。まず本実施形態の概要について説明する。本実施形態では、スレッド間で共有される共有データは、その共有データにアクセスする回数が最も多いスレッドが動作するCPUと同じノードのメモリに配置するようにし、また、あるスレッドのみからアクセスされる非共有データは、なるべくそのスレッドが動作するCPUと同じノードのメモリに配置するようにする。このようにすることによって、NUMAで動作するマルチスレッドプログラムのメモリアクセスを最適化する。上記概要について具体例を用いて説明する。本実施形態ではまず、上記第1の実施形態で説明した図2のステップ1~3-2までが行われる。なお、ステップ1の1回目のコンパイルリンクのときは、マルチスレッドプログラムが生成される。このとき、そのプログラムを実行するCPUは固定されない。よって、ステップ2で1回目のコンパイルリンクで生成されたマルチスレッドプログラムは、図10に示すNUMAを採用した動作コンピュータにおいて、CPUを固定されないまま実行、動作される。また、ステップ3-1において、プロファイルデータは例えば図11に示すものとし、メモリデバイス情報は例えば図5に示すものとする。図11に示すプロファイルデータは、動作コンピュータ上のメモリプロファイラがメモリアクセスを監視することで得られるのは、これまで説明した各実施形態と同様である。ただし、図11のプロファイルデータは、図4や図7で例示したものと中身が異なる。すなわち、図11のプロファイルデータでは、開始アドレスと終端アドレスとで示されるアドレス範囲毎に、各スレッドの読み出し回数と書き込み回数が対応付けられて記録された情報となっている。また、ステップ3-2では、第4の実施形態と同様に、コンパイラは、プログラムが動作するCPUが実行中に変わらないようにするために、CPUの固定を行う。ただし、本実施形態では、コンパイラは、図11のプロファイルデータを基に、共有データをアクセスする回数が最も高いスレッドを特定した上で、そのスレッドが動作するCPUを固定する。スレッドの特定について以下に説明する。コンパイラは、図11において、アドレス範囲毎に、全てのスレッドがアクセスしているか調べる。図11の例では、アドレス範囲0x800000000x80000010のデータが、スレッド0xA0、0xC0、0xF0の全部からアクセスされているので、コンパイラは、そのデータを共有データとみなす。次に、コンパイラは、図11において、その共有データに対する読み出し回数と書き込み回数を参照し、最もアクセス回数の多いスレッドを特定する。図11の例では、アドレス範囲0x800000000x80000010の共有データに最もアクセスが多いのはスレッドID0xC0のスレッドである。次に、コンパイラは、特定したスレッド0xC0が動作するCPUを、図10のCPU1又はCPU2のいずれかに固定する。また、コンパイラは、アドレス範囲毎に、特定のスレッドのみがアクセスしているかも調べる。図11の例では、アクセス範囲0x800000100x80000020のデータは、スレッド0xA0のみからアクセスされているため、非共有データとみなされ、スレッド0xA0が動作するCPUを、図10のCPU1又はCPU2のいずれかに固定する。以上のようなステップ3-2の後、リンカは、ステップ3-3の代わりとして、以下の動作を行う。リンカは、図11のプロファイルデータ及び図5のメモリデバイス情報を基に、上記第1の実施形態において図6を用いて説明した動作を行う。この動作において、リンカはまず、図11に示すアドレス範囲毎に、読み出し回数及び書き込み回数を集計する。このとき、読み出し回数は、全てのスレッド図11では0xA0、0xC0、0xF0の読み出し回数の合計となり、書き込み回数も、全てのスレッドの書き込み回数の合計となる。次にリンカは、その集計の結果と図5に示される読み出し速度及び書き込み速度を基に、図11に示すアドレス範囲毎に、そのアドレス範囲に置かれていたデータが仮にメモリ1に配置された場合と仮にメモリ2に配置された場合それぞれの読み書き合計時間を算出する。この算出には、図5の読み出し速度、書き込み速度が用いられる読み書き合計時間=読み出し回数×読み出し速度書き込み回数×書き込み速度。次にリンカは、図11に示すアドレス範囲毎に、算出した2つの読み書き合計時間仮にメモリ1に配置された場合の読み書き合計時間と仮にメモリ2に配置された場合の読み書き合計時間の差を算出する。そして、リンカは、図11に示すアドレス範囲のうち、差が大きいアドレス範囲に置かれていたデータ共有データ及び非共有データから順に、コンパイラにより固定されたCPUと同じノードにあるメモリ同一ノードにおいて、固定されたCPUと対となっているメモリに配置するようにする。メモリ1又はメモリ2のどちらが、コンパイラにより固定されたCPUと同じノードにあるメモリであるかは、リンカが、コンパイラにより発行された専用命令を参照することで認識できる。このようにして、アクセス頻度の高いデータ共有データ及び非共有データについて、頻度の高い順に、プログラムが実行されるノードのメモリに配置する再配置が行われる。なお、プログラムが実行されるノードのメモリに配置されなかったデータは、別のノードのメモリに配置される。以上説明したように、本実施形態によれば、コンパイル及びリンクによりNUMAで動作するマルチスレッドプログラムを生成する際に、共有データ、非共有データに対するメモリアクセスの最適化を実現できる。その結果、生成されるプログラムのパフォーマンス向上を実現できる。第6の実施形態本実施形態では、NUMAを採用した図10に示す構成において、ノード1及びノード2のそれぞれにキャッシュメモリを備えたコンピュータでの動作を想定したプログラムを生成する場合について説明する。本実施形態では、まず、上述した第4の実施形態の動作又は第5の実施形態の動作を行う。次に、ノード毎に、上述した第2の実施形態の動作図9のフローを行い、キャッシュメモリのヒット率を向上させる。ただし、先行する第4の実施形態の動作又は第5の実施形態の動作の際に、後続の第2の実施形態の動作で必要な情報プロファイルデータ及びメモリデバイス情報をコンパイラリンカが取得できた場合は、第2の実施形態の動作において、先行動作と重複するステップ例えば、図3のステップ1~ステップ3-2を省略してもよい。第2の実施形態の動作を行うにあたり、ノード1においては、メモリ1に配置されるようにした以外のデータリモートメモリメモリ2に配置されるようにしたデータと、メモリ1に配置されるようにしたデータローカルメモリメモリ1に配置されるようにしたデータの両方を対象にする必要がある。また、第2の実施形態の動作を行うにあたり、ノード2においては、メモリ2に配置されるようにした以外のデータリモートメモリメモリ1に配置されるようにしたデータと、メモリ2に配置されるようにしたデータローカルメモリメモリ2に配置されるようにしたデータの両方を対象にする必要がある。これは、第3の実施形態で説明したキャッシュメモリ、RAM、SRAMの関係と同じである。すなわち、キャッシュメモリは、アクセスがローカルメモリに対するものであろうが、リモートメモリに対するものであろうが、分け隔てなくキャッシュヒット、ミスの処理を行うため、ローカルメモリへ配置するようにしたデータと、リモートメモリへ配置するようにしたデータの両方を、第2の実施形態の動作を行う対象にする必要がある。なお、本実施形態で行われる第2の実施形態の動作として図9のフローの流れに変わりはないが、アクセス時間の総計を計算する際には、キャッシュ、ローカルメモリ、リモートメモリの読み書きアクセス時間が必要になる。従って、図8のメモリデバイス情報では、キャッシュメモリ、ローカルメモリ、リモートメモリの情報が必要になる。例えば、図8において、RAMの代わりにメモリ1、メモリ2とし、それぞれについて各種情報開始アドレス、終端アドレス、読み出し速度、書き込み速度が定義されればよい。以上説明したように、本実施形態によれば、コンパイル及びリンクによりプログラムを生成する際に、NUMAにおいて各ノードにキャッシュメモリを含む場合の、複数のメモリのアクセス速度の違いを考慮した最適化を実現できる。その結果、キャッシュヒット率を向上させ、生成されるプログラムの更なるパフォーマンス向上を実現できる。以上、本発明の各実施形態について説明したが、上記各実施形態に限定されるものではなく、その要旨を逸脱しない範囲において種々の変形が可能である。例えば、上述した実施形態における動作は、ハードウェア、または、ソフトウェア、あるいは、両者の複合構成によって実行することも可能である。ソフトウェアによる処理を実行する場合には、処理シーケンスを記録したプログラムを、専用のハードウェアに組み込まれているコンピュータ内のメモリにインストールして実行させてもよい。あるいは、各種処理が実行可能な汎用コンピュータにプログラムをインストールして実行させてもよい。例えば、プログラムは、記録媒体としてのハードディスクやROMReadOnlyMemoryに予め記録しておくことが可能である。あるいは、プログラムは、CD-ROMCompactDiscReadOnlyMemory、MOMagnetoOpticalディスク、DVDDigitalVersatileDisc、USBUniversalSerialBusメモリ、磁気ディスク、半導体メモリなどのリムーバブル記録媒体に、一時的、あるいは、永続的に格納記録しておくことが可能である。このようなリムーバブル記録媒体は、いわゆるパッケージソフトウエアとして提供することが可能である。なお、プログラムは、上述したようなリムーバブル記録媒体からコンピュータにインストールする他、ダウンロードサイトから、コンピュータに無線転送してもよい。または、LANLocalAreaNetwork、インターネットといったネットワークを介して、コンピュータに有線で転送してもよい。コンピュータでは、転送されてきたプログラムを受信し、内蔵するハードディスク等の記録媒体にインストールすることが可能である。また、上記実施形態で説明した処理動作に従って時系列的に実行されるのみならず、処理を実行する装置の処理能力、あるいは、必要に応じて並列的にあるいは個別に実行するように構築することも可能である。