(57)【要約】マルチクラスメモリシステム（１０１）におけるメモリ割り当てシステム（１００）は、統合メモリアドレス空間を共有する複数のメモリ（１０６，１０７，１０８，１０９）に結合可能なプロセッサ（１０２）と、ソフトウェア関数のライブラリを記憶するライブラリ（１２０，６２０）と、を備える。プロセッサは、データ構造をメモリに割り当てるための、ライブラリへのメモリ割り当て関数呼び出し（１２６）に応じて、データ構造（１２８）のタイプを識別する。プロセッサは、ライブラリを用いて、データ構造のタイプに基づいて、データ構造の各部分を、マルチクラスメモリシステムの複数のメモリに割り当てる。【選択図】図１
2017517792.tif 000002
【特許請求の範囲】
【請求項１】
マルチクラスメモリシステム（１０１）において、データ構造（１２８）をメモリに割り当てるための、ライブラリ（１２０，６２０）へのメモリ割り当て関数呼び出し（１２６，６０２，６０４）に応じて、
前記マルチクラスメモリシステムのプロセッサ（１０２）において、前記データ構造のタイプを識別することと、
前記マルチクラスメモリシステムの前記プロセッサにおいて、前記ライブラリを用いて、前記データ構造の前記タイプに基づいて、前記データ構造の各部分を前記マルチクラスメモリシステムの複数のメモリ（１０６，１０７，１０８，１０９）に割り当てることと、を含む、
方法。
【請求項２】
前記データ構造の各部分を複数のメモリに割り当てることは、
前記データ構造のメタデータ（４０２，４０３，４０４，４０５，４０６，４０７，４０８，４０９，４１０，４１１，４１２）を、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記データ構造のデータ（４２２、４２３、４２４、４２５、４２６、４２７、４２８、４２９、４３０、４３１、４３２）を、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、をさらに含む、
請求項１に記載の方法。
【請求項３】
前記データ構造は、順序付けされたデータ構造（２００，４００）を含み、
前記順序付けされたデータ構造の各部分を割り当てることは、
前記順序付けされたデータ構造の最初の部分（２５０）を、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記順序付けされたデータ構造の最後の部分（２５２）を、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、を含む、
請求項１に記載の方法。
【請求項４】
前記順序付けされたデータ構造は、木構造（４００）を含み、
前記順序付けされたデータ構造の前記最初の部分は、前記木構造の最初のレベルのノード（４０２，４０３，４０４，４０５，４０６，４０７，４０８）を含み、
前記順序付けされたデータ構造の前記最後の部分は、前記木構造の最後のレベルのノード（４０９，４１０，４１１，４１２）を含む、
請求項３に記載の方法。
【請求項５】
前記メモリ割り当て関数呼び出しは、複数のパラメータ（１３６）をさらに含み、
前記データ構造の各部分を前記マルチクラスメモリシステムの複数のメモリに割り当てることは、
前記複数のパラメータに基づいて、前記データ構造の各部分を、前記マルチクラスメモリシステムの複数のメモリに割り当てることをさらに含む、
請求項１に記載の方法。
【請求項６】
前記データ構造は、リンクリスト（２００）を含み、
前記データ構造の各部分を前記マルチクラスメモリシステムの複数のメモリに割り当てることは、
前記リンクリストの最初のセグメント（２５０）を、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記リンクリストの最後のセグメント（２５２）を、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、をさらに含み、
前記第１のセットの１つ以上のメモリは、前記第２のセットの１つ以上のメモリよりも速いアクセスを提供する、
請求項１に記載の方法。
【請求項７】
前記データ構造は、マップ構造（３００）を含み、
前記データ構造の各部分を前記マルチクラスメモリシステムの複数のメモリに割り当てることは、
前記マップ構造のキー部分（３５０）を、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記マップ構造の値部分（３５２）を、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、をさらに含み、
前記第１のセットの１つ以上のメモリは、前記第２のセットの１つ以上のメモリよりも速いアクセスを提供する、
請求項１に記載の方法。
【請求項８】
前記データ構造は、グラフ構造（４００）を含み、
前記データ構造の各部分を前記マルチクラスメモリシステムの複数のメモリに割り当てることは、
グラフ構造のノードメタデータ（４０２，４０３，４０４，４０５，４０６，４０７，４０８，４０９，４１０，４１１，４１２）を、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記グラフ構造のノードデータ部分（４２２，４２３，４２４，４２５，４２６，４２７，４２８，４２９，４３０，４３１，４３２）を、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、を含み、
前記第１のセットの１つ以上のメモリは、前記第２のセットの１つ以上のメモリよりも速いアクセスを提供する、
請求項１に記載の方法。
【請求項９】
マルチクラスメモリシステム（１０１）のプロセッサ（１０２）において、前記マルチクラスメモリシステムの複数のメモリレベルのうち指定されたメモリレベルのインジケータを有するメモリ割り当て関数呼び出し（６０２，６０４）を実行することと、
前記メモリ割り当て関数呼び出しの実行に応じて、前記指定されたメモリレベルにおいて、データ構造（１２８）をメモリに割り当てることと、を含む、
方法。
【請求項１０】
前記インジケータは、前記関数呼び出しのタイプ、前記関数呼び出しを介して渡されたパラメータ（１３６）、及び、前記関数呼び出しとは別のシンタックスインデックス、のうち少なくとも１つを含む、
請求項９に記載の方法。
【請求項１１】
ライブラリを記憶するライブラリ（１２０，６２０）ストアと、
統合メモリアドレス空間を共有する複数のメモリ（１０６，１０７，１０８，１０９）に結合可能なプロセッサ（１０２）と、を備え、
前記プロセッサは、
データ構造をメモリに割り当てるための、前記ライブラリへのメモリ割り当て関数呼び出し（１２６，６０２，６０４）に応じて、
前記データ構造のタイプを識別し、
前記ライブラリを用いて、前記データ構造の各部分を、前記データ構造の前記タイプに基づいて、前記複数のメモリのうち複数のメモリ間で割り当てる、
システム（１００）。
【請求項１２】
前記プロセッサは、
前記データ構造のメタデータ（４０２，４０３，４０４，４０５，４０６，４０７，４０８，４０９，４１０，４１１，４１２）を、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記データ構造のデータ（４２２，４２３，４２４，４２５，４２６，４２７，４２８，４２９，４３０，４３１，４３２）を、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、
によって、前記データ構造の各部分を複数のメモリ間で割り当てる、
請求項１１に記載のシステム。
【請求項１３】
前記メモリ割り当て関数呼び出しは、複数のパラメータ（１３６）をさらに含み、
前記プロセッサは、前記データ構造の各部分を、前記複数のパラメータに基づいて、前記複数のメモリのうち複数のメモリに割り当てることによって、前記データ構造の各部分を、前記複数のメモリのうち複数のメモリに割り当てる、
請求項１１に記載のシステム。 
【請求項１４】
前記データ構造は、リンクリスト（２００）を含み、
前記プロセッサは、
前記リンクリストの最初のセグメント（２５０）を、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記リンクリストの最後のセグメント（２５２）を、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、
によって、前記データ構造の各部分を、前記複数のメモリのうち複数のメモリに割り当て、
前記第１のセットの１つ以上のメモリは、前記第２のセットの１つ以上のメモリよりも速いアクセスを提供する、
請求項１１に記載のシステム。
【請求項１５】
前記データ構造は、マップ構造（３００）を含み、
前記プロセッサは、
前記マップ構造のキー部分（３５０）を、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記マップ構造の値部分（３５２）を、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、
によって、前記データ構造の各部分を、前記複数のメモリのうち複数のメモリに割り当て、
前記第１のセットの１つ以上のメモリは、前記第２のセットの１つ以上のメモリよりも速いアクセスを提供する、
請求項１１に記載のシステム。
【請求項１６】
前記データ構造は、グラフ構造（４００）を含み、
前記プロセッサは、
前記グラフ構造のノードメタデータ（４０２，４０３，４０４，４０５，４０６，４０７，４０８，４０９，４１０，４１１，４１２）を、前記複数のメモリのうち第１のセットのメモリに割り当てることと、
前記グラフ構造のノードデータ部分（４２２，４２３，４２４，４２５，４２６，４２７，４２８，４２９，４３０，４３１，４３２）を、前記複数のメモリのうち第２のセットのメモリに割り当てることと、
によって、前記データ構造の各部分を、前記複数のメモリのうち複数のメモリに割り当て、
前記第１のセットの１つ以上のメモリは、前記第２のセットの１つ以上のメモリよりも速いアクセスを提供する、
請求項１１に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、概して、メモリシステムに関し、より具体的には、複数のメモリを用いるメモリシステムに関する。
【背景技術】
【０００２】
処理システムは、様々な設計要件を満たすために、マルチタイプ又はレベルのメモリ（例えば、揮発性及び不揮発性のメモリアーキテクチャの組み合わせや、パッケージ内メモリ及び外部メモリの組み合わせ等）を実装し得る。例えば、マルチレベルメモリを用いて、帯域幅、容量及び拡張性の増加という特徴のうち１つ以上を提供するメモリを組み合わせて、これらの特徴を活用してもよい。統合（unified）メモリアドレス空間を有するマルチレベルメモリシステムのメモリ間でデータ構造を割り当てると、システム性能に影響を与えることがある。従来、オペレーティングシステム又は当該オペレーティングシステムのハードウェアは、静的な所定の条件に基づいて、又は、表面上では任意の割り当てに基づいて、マルチレベルメモリシステムのメモリ間でデータ構造をどのように割り当てるのかを決定していた。この結果、マルチレベルメモリシステムの異なるメモリの利用が非効率になったり、効果が無くなったりすることが多い。
【０００３】
本開示は、添付図面を参照することによって、より良く理解されであろうし、本開示の多くの特徴及び長所が当業者に明らかになるであろう。異なる図面における同一の符号は、類似又は同一の項目を示している。
【図面の簡単な説明】
【０００４】
【図１】いくつかの実施形態に係る、マルチクラスメモリシステムを用いた処理システムのブロック図である。
【図２】いくつかの実施形態に係る、リンクリストデータ構造の例示的なメモリ割り当てを示す図である。
【図３】いくつかの実施形態に係る、マップデータ構造の例示的なメモリ割り当てを示す図である。
【図４】いくつかの実施形態に係る、二分木データ構造の例示的なメモリ割り当てを示す図である。
【図５】いくつかの実施形態に係る、マルチクラスメモリシステムのメモリ間でデータ構造のメモリ割り当てを行う方法を示すフロー図である。
【図６】いくつかの実施形態に係るマルチクラスメモリシステムを用いた処理システムのブロック図である。
【図７】いくつかの実施形態に係る、マルチクラスメモリシステムのメモリ間でデータ構造のメモリ割り当てを行う方法を示すフロー図である。
【発明を実施するための形態】
【０００５】
図１〜図７は、マルチクラスメモリシステムを用いた処理システムにおいて、ソフトウェアプログラムのデータ構造のメモリ割り当てを行うシステム及び技術を例示する図である。いくつかの実施形態においては、処理システムは、マルチクラスメモリシステムと、処理コア及びメモリコントローラを有するプロセッサと、を備える。マルチクラスメモリシステムは、統合メモリアドレス空間を共有する少なくとも２つの異なるメモリクラス（各クラスは、レベル及びタイプのうち１つ以上を規定する）からなる複数のメモリを備える。プロセッサが、データ構造をメモリに割り当てるために、ライブラリへのメモリ割り当て関数呼び出し（例えば、malloc）を実行したことに応じて、ライブラリは、データ構造のタイプを識別し、オペレーティングシステムは、データ構造のタイプに基づいて、データ構造の一部をマルチクラスメモリシステムの複数のメモリに割り当てる。例えば、いくつかの実施形態においては、オペレーティングシステムは、より頻繁に検索、アクセスされるデータ構造の一部が、アクセス時間の速いメモリに割り当てられ、あまり頻繁に検索、アクセスされないデータ構造の一部が、アクセス時間の遅いメモリに割り当てられるように、データ構造の一部をメモリに割り当てる。いくつかの実施形態においては、関数呼び出しは複数のパラメータを含み、プロセッサが関数呼び出しを実行すると、オペレーティングシステムは、当該パラメータに基づいてデータ構造の一部を割り当てる。別の実施形態においては、関数呼び出しは、マルチクラスメモリシステムのメモリレベルのインジケータを含み、プロセッサが当該インジケータを含む関数呼び出しを実行すると、オペレーティングシステムは、データ構造の識別された一部を、インジケータされたメモリレベルに割り当てる。記載された技術は、処理コアが、データ構造の一部をどのように検索又はアクセスする可能性が高いのかに基づいて、データ構造の一部をより効率的に割り当てることを可能にし、これにより、性能を向上させ、消費電力を低減する。
【０００６】
図１は、いくつかの実施形態に係る、マルチクラスメモリシステム１０１を用いた処理システム１００のブロック図である。処理システム１００は、プロセッサ１０２と、メモリ階層１０４と、を備えている。メモリ階層１０４は、２つ以上の異なるクラスに属する複数のメモリを含む。各クラスは、レベル及びタイプのうち一方又は両方を規定する。メモリレベルは、メモリの位置的なアクセス速度に基づいている。例えば、パッケージ内メモリ及びパッケージ外メモリ（すなわち、「オンチップ」メモリ及び「オフチップ」メモリ）間では、一般的に、パッケージ内メモリのアクセス速度がより速い。少なくとも１つの実施形態においては、マルチクラスメモリシステム１０１は、マルチレベルのメモリシステムである。メモリタイプは、メモリの個々のアーキテクチャに基づいており、各メモリは、様々なメモリタイプの任意のタイプを含んでもよい。例えば、粒度の低い分け方では、揮発性メモリ対不揮発性メモリであってもよいし、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）対スタティックランダムアクセスメモリ（ＳＲＡＭ）対相変化メモリ対メモリスタメモリ等であってもよい。粒度の高い分け方では、同じタイプの一般的なメモリアーキテクチャ内の異なるアーキテクチャ（例えば、ＤＤＲ３  ＳＤＲＡＭ（double data rate type three synchronous dynamic random access memory）、ＧＤＤＲ５  ＳＤＲＡＭ（graphics double data rate version five synchronous dynamic random access memory）、及び、ＬＰＤＤＲ  ＳＤＲＡＭ（low power double data rate synchronous dynamic random access memory）等）であってもよい。
【０００７】
統合メモリアドレス空間１１６内のメモリ１０６，１０７，１０８，１０９の各々は、そのレベル若しくはタイプ又はこれら両方に基づいて、各メモリクラス（クラス「Ｉ」，「ＩＩ」と示す）に分類される。従って、いくつかの実施形態においては、メモリ１０６，１０７，１０８，１０９は、同じクラス内のメモリが、同じレベル、同じタイプ、及び、例えばアクセスタイム、帯域幅、データ転送速度等の他の操作特性のうち１つ以上を共有するように、分類されてもよい。例示すると、メモリ１０６，１０７は、両方とも同じレベル（例えば、パッケージ内）に存在するとしてクラスＩに分類されてもよく、メモリ１０８，１０９は、両方とも同じレベル（例えば、パッケージ外）に存在するとしてクラスＩＩに分類されてもよい。また、メモリ１０６，１０７は、両方とも例えばＤＲＡＭアーキテクチャを実装しているとしてクラスＩに分類されてもよく、メモリ１０８，１０９は、両方とも例えばＳＲＡＭアーキテクチャを実装しているとしてクラスＩＩに分類されてもよい。
【０００８】
メモリ階層１０４は、２つのパッケージ内メモリ１０６，１０７と、２つのパッケージ外メモリ１０８，１０９として図１の実施形態に示されているが、他の実施形態では、少なくとも２つのクラスに亘る任意の数のメモリを用いてもよい。さらに、いくつかの実施形態においては、メモリ階層１０４は、全てのパッケージ外メモリと全てのパッケージ内メモリとを含む、パッケージ内メモリ及びパッケージ外メモリの任意の組み合わせを含んでもよい。メモリ階層１０４のいくつかの実施形態では、全体としてのフットプリントを小さくしたまま容量を増やす又は複数のメモリを活用するために、ダイスタックメモリを実装してもよい。ダイスタックメモリは、シリコン貫通電極（ＴＳＶ）又は他の垂直相互接続技術を用いて垂直に積層するように実装されてもよいし、メモリダイがインターポーザを介して接続されるように、プロセッサ若しくは互いに対して水平方向に「スタック」される水平配置であってもよい。図１の実施形態において、パッケージ内メモリ１０６，１０７は、（クラス「Ｉ」で表される）同じクラスであるものとして示され、パッケージ外メモリ１０８，１０９は、（クラス「ＩＩ」で表される）同じクラスであるものとして示されている。さらに、他の実施形態のマルチクラスメモリシステム１０１は、異なるレベル若しくは異なるタイプ又はこれらの組み合わせのメモリを含んでもよい。例えば、少なくとも１つの実施形態においては、マルチクラスメモリシステム１０１は、レベルが全て同じであるがタイプが異なるメモリを含む。
【０００９】
プロセッサ１０２は、プロセッサコア１１０，１１１と、メモリコントローラ１１２と、を備えている。図示した実施形態では、プロセッサ１０２に実装されるメモリコントローラ１１２を示しているが、他の実施形態では、メモリコントローラ１１２は、他の場所（例えば、メモリ１０８，１０９のうち１つ以上を実装するスタックメモリ装置のメモリインタフェース）において実装されてもよい。さらに、いくつかの実施形態では、プロセッサ１０２は、複数のメモリコントローラ１１２を含む。メモリコントローラ１１２は、アドレス空間の割り当てに基づくメモリアドレス要求に応じて、メモリ１０６，１０７，１０８，１０９からデータを読み出す。従って、図示した実施形態では、メモリコントローラ１１２及び処理システム１００は、メモリ１０６，１０７，１０８，１０９を、単一のフラットな統合メモリアドレス空間１１６として扱う。結果として、異なるクラス（Ｉ，ＩＩ）のメモリは、同じメインメモリ又はシステムメモリ内に存在するという点において、論理的に、従来のメモリ階層の同じレベルの部分となる。従って、異なるクラス（Ｉ，ＩＩ）の全てのメモリは、同一の、統合された、フラットな物理メモリアドレス空間を介してアクセス可能である。
【００１０】
従来、オペレーティングシステム又は当該オペレーティングシステムのハードウェアは、静的な所定の条件に基づいて、又は、表面上では任意の割り当てに基づいて、マルチクラスメモリシステムのメモリ間でデータ構造をどのように割り当てるのかを決定していた。かかる従来のアプローチでは、データがどのようにアクセスされるかという、より高いレベル（例えば、ソフトウェア、データ構造、アルゴリズム等）のセマンティック又はドメイン固有の知識を活用できないので、データ構造において頻繁にアクセスされる部分が性能の低いメモリによく割り当てられることによって、効率を低下させ、全体としての性能を低下させる。
【００１１】
一方、図示した実施形態においては、ライブラリストアは、ライブラリ１２０を含む。ライブラリ１２０は、ライブラリ１２０のバックエンド実装がメモリ割り当ての決定を動的に処理するように、データ構造、アルゴリズム及び他のサービスを、アプリケーションプログラミングインタフェース（ＡＰＩ）１２２を介してプログラマ又は他のユーザに提供する。これにより、データがどのようにアクセスされるかという高レベルのセマンティック又はドメイン固有の知識に基づいて、割り当てを決定することができる。例えば、いくつかの実施形態では、ライブラリ１２０は、マルチレベルのメモリ認識ソフトウェアインタフェースを用いて、データ構造を、マルチクラスメモリシステム１０１のメモリ１０６，１０７，１０８，１０９に選択的に割り当ててもよい。また、ライブラリ１２０は、異なるメモリレベルからの自身のメモリページのプールを維持してもよく、データ構造が適切であると判断すると、これらのページへのデータ構造の割り当てを明示的に処理してもよい。ライブラリ１２０は、例えば、Ｃ＋＋標準テンプレートライブラリ（ＳＴＬ）、Ｊａｖａ（登録商標）標準ライブラリ、Ｃ♯及び.ＮＥＴ  Ｆｒａｍｅｗｏｒｋ、カスタムライブラリ、ドメイン固有ライブラリ等のように、メモリ割り当てを透過的に管理する任意のライブラリであってもよい。ライブラリ１２０のメモリ割り当て決定に基づいて、処理システム１００のオペレーティングシステム１２１は、統合フラットアドレス空間をメモリ１０６，１０７，１０８，１０９に割り当てる。
【００１２】
図示した実施形態において、プロセッサコア１１１は、ライブラリ１２０へのメモリ割り当て関数呼び出し１２６を含むソフトウェアプログラム１２４を実行して、データ構造１２８をメモリに割り当てる。ソフトウェアプログラム１２４は、ＡＰＩ１２２を介してライブラリ１２０にアクセスする。少なくとも１つの実施形態においては、ライブラリ１２０は、データ構造タイプテーブル１３０を参照して、割り当てられるデータ構造１２８のタイプに基づいて、データ構造１２８を、どのようにマルチクラスメモリシステム１０１のメモリ１０６，１０７，１０８，１０９に割り当てるのかを決定する。データ構造タイプテーブル１３０は、静的な割り当てルールを含んでもよく、メモリアクセス履歴又は他の情報等に基づいて更新されるヒューリスティックを維持してもよい。データ構造１２８は、様々なデータ構造のうち任意のデータ構造（例えば、リンクリスト、マップ構造、二分木、グラフ構造、アレイ、タプル（tuple）等）であってもよい。ライブラリ１２０は、プロセッサ１０２の効率的な性能を維持するために、データ構造１２８のタイプに基づいて、オペレーティングシステム１２１が、データ構造１２８の異なる部分をマルチクラスメモリシステム１０１の異なるメモリに割り当てることを決定してもよい。
【００１３】
例えば、図示した実施形態においては、ライブラリ１２０は、オペレーティングシステム１２１が、データ構造１２８の第１の部分１３２をメモリ１０６に割り当て、データ構造１２８の第２の部分１３４をメモリ１０９に割り当てることを示している。ライブラリ１２０は、データ構造のタイプの動的アクセスパターンに基づく決定（例えば、より頻繁に用いられる部分を、より速いアクセスタイムを有するメモリに割り当てるべきである）、各メモリ１０６，１０７，１０８，１０９又はクラスの利用可能なメモリの量に基づく決定（例えば、利用可能なメモリ空間が存在する限り、データ構造１２８のうち可能な限り多くの部分を、アクセスタイムの速いメモリに割り当てるべきである）、又は、これらの組み合わせに基づく決定等を行ってもよい。少なくとも１つの実施形態においては、各部分１３２，１３４は、データ構造１２８のメタデータ及びデータを表し、メタデータ部分１３２は、複数のメモリ１０６，１０７，１０８，１０９のうち第１のセットのメモリ１０６に割り当てられ、データ部分１３４は、複数のメモリ１０６，１０７，１０８，１０９のうち第２のセットのメモリ１０９に割り当てられる。図示した例においては、第１の部分１３２（例えば、データ構造１２８のメタデータ等）は、メモリ１０９よりも速いアクセスを提供するクラスＩのメモリ１０６に割り当てられ、第２の部分１３４（例えば、データ構造１２８のデータ等）は、メモリ１０９に割り当てられる。かかる割り当ては、メタデータがデータ構造１２８のデータより小さいため、メタデータがデータより頻繁にアクセスされるため、又は、これらの組み合わせ等の理由によって、プロセッサ１０２の性能を向上し得る。
【００１４】
図示した実施形態では、ライブラリ１２０は、データ構造１２８を２つの部分１３２，１３４に分け、各々の部分が２つのメモリ１０６，１０９に割り当てられる場合を示しているが、他の実施形態では、データ構造１２８をより多くの部分に分けてもよいし、データ構造をより多くのメモリに割り当ててもよいし、データ構造１２８を複数の部分に分けずに割り当ててもよい。さらに、いくつかの実施形態においては、ライブラリ１２０は、データ構造１２８の各部分１３２，１３４をオペレーティングシステム１２１の特定のメモリクラス（Ｉ、ＩＩ）に割り当てて、当該各部分のサブセクションを、均等の、任意の、又は、１つ以上のヒューリスティックスに基づいて、特定のクラスのメモリ間に分散させる（例えば、部分１３２をクラスＩに割り当てる場合には、オペレーティングシステム１２１は、当該部分１３２のサブセクションを、クラスＩのメモリ１０６，１０７に分散させる）。さらに、部分及びサブセクションは、データ構造１２８の任意の部分又はサブセクションを表してもよく、連続している必要はない。
【００１５】
いくつかの実施形態においては、ライブラリ１２０は、データ構造１２８をどのようにマルチクラスメモリシステム１０１のメモリ１０６，１０７，１０８，１０９に割り当てるかということに関してプログラマが入力又は指示することを可能にするために、様々なインタフェース又はフック（hook）のうち任意のものを提供してもよい。この任意のものはオプションであってもよい。例えば、少なくとも１つの実施形態において、ライブラリ１２０は、プログラマ又は他のユーザがパラメータ１３６をメモリ割り当て関数呼び出し１２６に提供するのを可能にし、オペレーティングシステム１２１は、パラメータ１３６（又は複数のパラメータ）に基づいて、データ構造１２８の部分１３２，１３４を、マルチクラスメモリシステム１０１の複数のメモリ１０６，１０９に割り当てる。パラメータ１３６は、例えば、データ構造１２８のタイプ、データ構造１２８をどのように部分１３２，１３４に分けるのか、メモリ１０６，１０７，１０８，１０９のうち幾つのメモリを使用するのか、メモリ１０６，１０７，１０８，１０９のうち何れのメモリを使用するのか、何れのクラス（Ｉ，ＩＩ）を使用するのか、１つ以上の制限（例えば、最初のｎ行に関するデータからメタデータのみを分けて割り当てる）等を示してもよい。
【００１６】
少なくとも１つの実施形態においては、ライブラリ１２０は、ドメイン固有のライブラリを含む。ドメイン固有のライブラリの例としては、基本線形代数サブプログラム（ＢＬＡＳ：basic linear algebra subprograms）、ＡＴＬＡＳ（automatically tuned linear algebra software）、ＰＥＴＳｃ（portable extensible toolkit for scientific computation)及びアプリケーションマークアップ言語（ＡＰＰＭＬ）等のように、基本線形代数専用のルーチンが挙げられる。例えば、ＡＴＬＡＳは、最適化パラメータ空間（ブロック化因数、アンロール)及び実装アルゴリズムを検索して、高度に最適化されたハードウェア固有の線形代数ルーチンを生成する自己最適化ライブラリである。かかるライブラリの例は、行列積のブロックの使用である。一実施態様は、メモリ階層１０４のレベル毎に異なるブロック機構を想定し、データを下位レベルから最内側ループに対応する上位レベルに移動させるように、ライブラリ１２０を構成することを含む。かかるルーチンは、ＤＲＡＭへのアクセスは固定コストであるが、複数のクラスのメモリを含むシステムにおいては、アルゴリズムが、より速いメモリに関してリファクタリングされる必要があると想定している。疎行列ベクトル積（ＳｐＭＶ：sparse matrix vector multiplies）は、多くの高性能コンピューティング（ＨＰＣ）アプリケーションの性能において重要なアルゴリズムの他の例である。ＳｐＭＶは、一般的に、ＣＳＲ（compressed row format）を用いて表される。ＣＳＲにおいては、非ゼロ行要素が値アレイに記憶され、列インデックスが列アレイに記憶され、各行の始まりに関する列アレイへのインデックスが行インデックス列に記憶される。一実施形態においては、ライブラリ１２０は、インデックスアレイの記憶を速い方のメモリ（例えば、クラスＩ）に割り当て、大きい値アレイを遅い方のメモリ（例えば、クラスＩＩ)に割り当てることによって、速い検索を可能にする。これらのライブラリは、実行中、マルチクラスメモリシステム１０１の静的最適化に加えて、プロファイルに基づく動的最適化を挿入して、異なるメモリレベル間のデータ構造の構成要素を移動させることができる。
【００１７】
図２は、いくつかの実施形態に係る、図１の処理システム１００によるリンクリストデータ構造２００のメモリ割り当ての例を示す図である。リンクリストデータ構造２００は、リンクされたノード２０４〜２１５を含み、ノード２０４はノード２０５へのリンク又は他の参照を含み、ノード２０５はノード２０６へのリンクを含み、ノート２０６はノード２０７へのリンクを含む、というように、最後のノード２１５まで同様にリンクされる。１つ以上のノードからデータを読み出すためのメモリアクセスは、リンクリストデータ構造２００の第１のノード２０４から所望のノードまでの各ノードの走査（traversing）が必要となる。例えば、ノード２０７のメモリアクセスは、プロセッサ１０２が、第１のノード２０４から開始して、ノード２０４からノード２０５へのリンクを通り、ノード２０５からノード２０６へのリンクを通り、最後に、ノード２０６からノード２０７へのリンクを通ることを必要とする。従来のメモリ割り当てでは、様々なノード２０４〜２１５を、マルチクラスメモリシステム１０１のメモリ１０６，１０７，１０８，１０９に任意に割り当てて、ノード２０４，２０５，２０６，２０７は、別々のメモリ１０６，１０７，１０８，１０９に記憶されてもよく、ノード２０７のメモリアクセスは、プロセッサ１０２が、リンクリストのノード２０４，２０５，２０６，２０７を走査して、個別のメモリ１０６，１０７，１０８，１０９の各々にアクセスする必要がある。これらの従来のアプローチは、あるノードに到達するために、複数のメモリに複数回アクセスする必要があり得るので非効率的であり、頻繁にアクセスされるデータが、アクセスタイムの遅いメモリに記憶される場合がある。一方、図示した例においては、オペレーティングシステム１２１は、リンクリストデータ構造２００のうちアクセス順の早いノードを有するセグメントが、アクセスタイムの速いメモリに割り当てられ、リンクリストデータ構造２００のアクセス順の遅いノードを有するセグメントが、アクセスタイムの遅いメモリに割り当てられるように、ノード２０４〜２１５のアクセス順に基づいてリンクリストデータ構造２００の一部を割り当てる。
【００１８】
ライブラリ１２０は、データ構造１２８をメモリに割り当てるためのＡＰＩ１２２を介した、ライブラリ１２０へのメモリ割り当て関数呼び出し１２６に応じて、データ構造１２８をリンクリストデータ構造２００として識別する。ライブラリ１２０は、タイプテーブル１３０、プログラム１２４によって提供された１つ以上のパラメータ１３６、又は、データ構造１２８自体に基づいて、リンクリストデータ構造２００がどのように各部分に分割され、マルチクラスメモリシステム１０１間に割り当てられるのかを決定する。図示した実施形態においては、２つの部分が示されており、第１の部分は、リンクリストデータ構造２００の最初のセグメント２５０を表しており、第２の部分は、リンクリストデータ構造２００最後のセグメント２５２を表している。最初のセグメント２５０のノード２０４〜２０８は、最後のセグメント２５２のノード２０９〜２１５と少なくとも同じくらい頻繁に（おそらくは、より頻繁に）アクセスされるので、オペレーティングシステム１２１は、最初のセグメント２５０を、比較的速いアクセスタイムを有するメモリ１０６，１０７を含むメモリクラスＩに割り当て、最後のセグメント２５２を、比較的遅いアクセスタイムを有するメモリ１０８，１０９を含むメモリクラスＩＩに割り当てる。結果として、ノード２０７のメモリアクセスは、クラスＩの１つ以上のメモリ１０６，１０７にのみアクセスする必要があり、ノード２１３のメモリアクセスは、ノード２０４〜２０８に対するクラスＩの１つ以上のメモリ１０６，１０７と、ノード２０９〜２１３に対するクラスＩＩの１つ以上のメモリ１０８，１０９と、にアクセスする必要がある。ノード２０４〜２０８は、比較的速いアクセスタイムを有するメモリ１０６，１０７からアクセスされるので、プロセッサ１０２は、リストの最初のセグメント２５０を比較的迅速に走査することが可能になり、リンクリストデータ構造２００のより効率的なメモリアクセスを可能にし得る。 このリンクリストメモリ割り当て技術は、例えば、単一にリンクされたリスト、二重にリンクされたリスト等のように、任意のタイプのリンクリストに適用されてもよい。リンクリストデータ構造２００は、所定のメモリ内に連続して割り当てられてもよいし、割り当てられなくてもよい。 
【００１９】
図示した例では、リンクリストデータ構造２００が、２つの異なるメモリクラス（Ｉ，ＩＩ）に割り当てられた最初のセグメント２５０及び最後のセグメント２５２を表す２つの部分に分けられている場合を示しているが、ライブラリ１２０は、リンクリストデータ構造２００の部分の数を任意に決定してもよく、当該部分を、任意の数のメモリクラス又は個々のメモリに割り当ててもよい。さらに、いくつかの実施形態においては、ライブラリ１２０は、プログラム１２４によって提供された１つ以上のパラメータ１３６に基づいて、割り当てを決定してもよい。例えば、パラメータ１３６は、リンクリストデータ構造２００をどのように各部分に分けるか、部分を幾つ生成するか、何れのメモリクラス（Ｉ，ＩＩ）を使用するか、メモリ１０６，１０７，１０８，１０９のうち何れのメモリを使用するか、リンクリストデータ構造２００のどの部分を何れのメモリ１０６，１０７，１０８又は何れのクラス（Ｉ，ＩＩ）に割り当てるか、リンクリストデータ構造２００の最初のノード２０４等を示してもよい。
【００２０】
図３は、いくつかの実施形態に係る、マップデータ構造３００に関する図１の処理システム１００によるメモリ割り当ての例を示す図である。マップデータ構造３００は、複数の値３１２〜３２１に結合された複数のキー３０２〜３１１を含み、メモリアクセスは、例えば、対応する値３１５を読み出すためにキー３０５のルックアップ操作が必要になる。従来のメモリ割り当てでは、様々なキー３０２〜３１１及び値３１２〜３２１を、マルチクラスメモリシステム１０１のメモリ１０６，１０７，１０８，１０９に任意に割り当てていた。これらの従来のアプローチでは、（例えば、線形連鎖又は他のハッシュ衝突処理技術のために）ある値に到達するために複数のメモリに複数回アクセスする必要があることから非効率であり、頻繁にアクセスされるデータが、アクセスタイムの遅いメモリに記憶される場合がある。一方に、図示した例においては、オペレーティングシステム１２１は、マップデータ構造３００のうちキー３０２〜３１１が、アクセスタイムの速いメモリに割り当てられ、マップデータ構造３００のうち対応する値３１２〜３２１が、アクセスタイムの遅いメモリに割り当てられるように、マップデータ構造３００の各部分を割り当てる。
【００２１】
ライブラリ１２０は、データ構造１２８をメモリに割り当てるためのＡＰＩ１２２を介した、ライブラリ１２０へのメモリ割り当て関数呼び出し１２６に応じて、データ構造１２８を、マップデータ構造３００として識別する。ライブラリ１２０は、タイプテーブル１３０、プログラム１２４によって提供された１つ以上のパラメータ１３６、又は、データ構造１２８自体に基づいて、マップデータ構造３００がどのように各部分に分割され、マルチクラスメモリシステム１０１間に割り当てられるのかを決定する。図示した実施形態においては、２つの部分が示されており、第１の部分は、マップデータ構造３００のキー部分３５０を表しており、第２の部分は、マップデータ構造３００の値部分３５２を表している。オペレーティングシステム１２１は、キー部分３５０を、比較的速いアクセスタイムを有するメモリ１０６，１０７を含むメモリクラスＩに割り当て、値部分３５２を、比較的遅いアクセスタイムを有するメモリ１０８，１０９を含むメモリクラスＩＩに割り当てる。結果として、メモリコントローラ１１２は、キーのルックアップ操作を迅速に進めることができ、対応する値を、アクセスタイムの遅いメモリから読み出し得る。処理システム１００は、複数のルックアップを含む状況において、かかるメモリ割り当ての効率性をさらに実感するであろう。さらに、マップデータ構造３００が、比較的大きいサイズの１つ以上の値３１２〜３２１を含む場合には、アクセスタイムが遅くなるが、容量の大きいメモリへの割り当てが有益となり得る。このマップデータ構造メモリ割り当て技術は、任意のタイプのマップ又は他の関連するアレイデータに適用されてもよい。マップデータ構造３００のキー３０２〜３１１及び値３１２〜３２１は、所定のメモリ内で連続して割り当てられてもよいし、割り当てられなくてもよい。
【００２２】
図示した例では、マップデータ構造３００が、２つの異なるメモリクラス（Ｉ，ＩＩ）に割り当てられたキー部分３５０及び値部分３５２を表す２つの部分に分けられている場合を示しているが、ライブラリ１２０は、マップデータ構造３００の部分の数を任意に決定してもよく、当該部分を、任意の数のメモリクラス又は個々のメモリに割り当ててもよい。さらに、ある実施形態においては、ライブラリ１２０は、プログラム１２４によって提供された１つ以上のパラメータ１３６に基づいて、割り当てを決定してもよい。例えば、パラメータ１３６は、マップデータ構造３００をどのように各部分に分けるか、部分を幾つ生成するか、何れのメモリクラス（Ｉ，ＩＩ）を使用するか、メモリ１０６，１０７，１０８，１０９のうち何れのメモリを使用するか、マップデータ構造３００のどの部分を何れのメモリ１０６，１０７，１０８，１０９又は何れのクラス（Ｉ，ＩＩ）に割り当てるか等を示してもよい。
【００２３】
図４は、いくつかの実施形態に係る、二分木データ構造４００に関する、図１の処理システム１００によるメモリ割り当ての例を示す図である。二分木データ構造４００は複数のノードを含み、各ノードは、ノードメタデータ４０２〜４１２（例えば、ノードＩＤ、キー、ポインタ、又は、他のノードへのリンクに関する情報）と、ノードデータ４２２〜４３２と、を記憶している。例えばノードデータ４２６等のノードデータを読み出すためのメモリアクセスでは、通常、様々な走査スキームのうち何れかのスキームに従って、二分木データ構造４００の複数のノードを走査することが必要である。例えば、間順走査スキーム（in-order traversal scheme）の場合には、ノードデータ４２６を読み出すためのメモリアクセスは、プロセッサ１０２が、二分木４００を、最初にノードメタデータ４０９、次にノードメタデータ４０５、ノードメタデータ４０３、最後にノードメタデータ４０６と走査して、ノードデータ４２６を読み出す必要がある。レベル順走査スキーム（level-order traversal scheme）の場合、ノードデータ４２６を読み出すためのメモリアクセスは、プロセッサ１０２が、二分木４００を、最初にルートノードメタデータ４０２、次にノードメタデータ４０３、ノードメタデータ４０４、ノードメタデータ４０５、最後にノードメタデータ４０６と走査して、ノードデータ４２６を読み出す必要がある。
【００２４】
従来のメモリ割り当てでは、ノードメタデータ４０２〜４１２及びノードデータ４２２〜４３２を、マルチクラスメモリシステム１０１のメモリ１０６，１０７，１０８，１０９に任意に割り当てていたので、走査スキームに従って連続的に走査されるノードが別々のメモリに割り当てられ、二分木データ構造４００の走査において、別々のメモリ１０６，１０７，１０８，１０９の各々にアクセスする必要があった。これらの従来のアプローチでは、要求されたノードに到達するために複数のメモリに複数回アクセスする必要があることから非効率であり、また、二分木データ構造４００のうち頻繁にアクセスされる部分が、アクセスタイムの遅いメモリに記憶される場合がある。一方、図示した例においては、オペレーティングシステム１２１は、二分木データ構造４００のうちノードメタデータ４０２〜４１２が、アクセスタイムの速いメモリに割り当てられ、二分木データ構造４００のうち対応するノードデータ４２２〜４３２が、アクセスタイムの遅いメモリに割り当てられるように、二分木データ構造４００の各部分を割り当てる。
【００２５】
ライブラリ１２０は、データ構造１２８をメモリに割り当てるためのＡＰＩ１２２を介した、ライブラリ１２０へのメモリ割り当て関数呼び出し１２６に応じて、データ構造１２８を、二分木データ構造４００として識別する。ライブラリ１２０は、タイプテーブル１３０、プログラム１２４によって提供された１つ以上のパラメータ１３６、又は、データ構造１２８自体に基づいて、二分木データ構造４００がどのように各部分に分割され、マルチクラスメモリシステム１０１間に割り当てられるのかを決定する。図示した実施形態においては、２つの部分が示されており、第１の部分は、二分木データ構造４００のノードメタデータ部分４５０を表しており、第２の部分は、二分木データ構造４００のノードデータ部分４５２を表している。説明の容易さのために、ノードメタデータ部分４５０及びノードデータ部分４５２は、二分木データ構造４００のうち選択されたノードのみを示しているが、ノードメタデータ部分４５０は、ノードメタデータ４０２〜４１２の全てを表しており、ノードデータ部分４５２は、ノードデータ４２２〜４３２の全てを表している。
【００２６】
オペレーティングシステム１２１は、ノードメタデータ部分４５０を、比較的アクセスタイムの速いメモリ１０６，１０７を含むメモリクラスＩに割り当て、ノードデータ部分４５２を、比較的アクセスタイムの遅いメモリ１０８，１０９を含むメモリクラスＩＩに割り当てる。結果として、二分木データ構造４００の走査は、ノードメタデータ４０２〜４１２が、アクセスタイムの速い１つ以上のメモリ１０６，１０７からアクセスされ、次にメモリコントローラ１１２が、要求したノードデータを、アクセスタイムの遅いメモリから読み出すことから、迅速に進み得る。さらに、アクセスタイムが遅いが容量の多いメモリへの割り当ては、比較的大きいサイズのノードデータ４２２〜４３２を含む二分木データ構造４００のノードに有益となり得る。
【００２７】
別の実施形態においては、オペレーティングシステム１２１は、ノードの走査順に基づいて二分木データ構造４００の各部分を割り当てるので、二分木データ構造４００の走査スキームによる走査順の早いノードを有するセグメントが、アクセスタイムの速いメモリに割り当てられ、二分木データ構造４００の走査スキームによる走査順の遅いノードを有するセグメントが、アクセスタイムの遅いメモリに割り当てられる。例えば、レベル順走査スキームのコンテキストにおいて、上位レベル（すなわち、ルートノードにより近い）のノードメタデータは、下位レベルの（すなわち、分岐により近い）ノードメタデータと少なくとも同じくらい頻繁に（おそらくは、より頻繁に）アクセスされるので、オペレーティングシステム１２１は、（ノードメタデータ４０２〜４０８を含む）第１の３つのレベルを、アクセスタイムの比較的速いメモリ１０６，１０７を含むメモリクラスＩに割り当て、(メタデータ４０９〜４１２を含む)分岐レベルを、アクセスタイムの比較的遅いメモリ１０８，１０９を含むメモリクラスＩＩに割り当ててもよい。結果として、ノードデータ４２７のメモリアクセスは、クラスＩの１つ以上のメモリ１０６，１０７にのみアクセスする必要があり、ノードデータ４３０のメモリアクセスは、ノードメタデータ４０２〜４０８についてはクラスＩの１つ以上のメモリ１０６，１０７と、ノードメタデータ４０９，４１０についてはクラスＩＩの１つ以上のメモリ１０８，１０９と、にアクセスする必要がある。ノードメタデータ４０２〜４０８は、比較的速いアクセスタイムを有するメモリ１０６，１０７からアクセスされるので、プロセッサ１０２は、第１の３つのレベルを比較的迅速に走査することができ、二分木データ構造４００の効率のより良いメモリアクセスを可能にする。
【００２８】
これらの二分木データ構造メモリ割り当て技術は、例えば三分木構造、Ｂ＋木構造、有向非巡回グラフ（ＤＡＧ）等の任意のタイプのグラフデータ構造に適用されてもよい。さらに、ノードメタデータ４０２〜４１２及びノードデータ４２２〜４３２は、所定のメモリ内に連続して割り当てられてもよいし、割り当てられなくてもよい。図示した例では、二分木データ構造４００が、ノードメタデータ部分４５０及びノードデータ部分４５２を表す２つの部分に分かれて、２つの異なるメモリクラス（Ｉ，ＩＩ）に割り当てられているが、ライブラリ１２０は、二分木データ構造４００の部分の数を任意に決定してもよく、各部分を任意の数のメモリクラス又は個々のメモリに割り当ててもよい。さらに、いくつかの実施形態においては、ライブラリ１２０は、プログラム１２４によって提供された１つ以上のパラメータ１３６に基づいて、割り当てを決定してもよい。例えば、パラメータ１３６は、二分木データ構造４００をどのように各部分に分けるか、部分を幾つ生成するか、何れのメモリクラス（Ｉ，ＩＩ）を使うか、メモリ１０６，１０７，１０８，１０９の何れのメモリを使うか、二分木データ構造４００のどの部分を何れのメモリ１０６，１０７，１０８，１０９又は何れのクラス（Ｉ，ＩＩ）に割り当てるか、を示してもよいし、走査スキーム等を示してもよい。
【００２９】
図５は、いくつかの実施形態に係る、マルチクラスメモリシステムのメモリ間でデータ構造をメモリに割り当てる例示的な方法５００を示すフロー図である。参照の容易さのために、方法５００は、図１のマルチクラスメモリシステム１０１の例示的なコンテキストにおいて以下に記載する。方法５００は、ブロック５０２で始まり、処理システム１００が、メモリ割り当て関数呼び出し１２６を受信する。この場合、プロセッサコア１１１は、データ構造１２８をメモリに割り当てるための、ライブラリ１２０へのメモリ割り当て関数呼び出し１２６を含むソフトウェアプログラム１２４を実行する。
【００３０】
ブロック５０４では、処理システム１００は、ＡＰＩ１２２を介してライブラリ１２０にアクセスする。ライブラリ１２０は、データ構造、アルゴリズム及び他のサービスを、ＡＰＩ１２２を介してプログラマ又は他のユーザに提供し、ライブラリ１２０のバックエンド実装によって、メモリ割り当て決定を動的に処理する。これにより、データがどのようにアクセスされるのかという高レベルのセマンティック又はドメイン固有の知識に基づく割り当て決定が可能になる。例えば、いくつかの実施形態においては、ライブラリ１２０は、マルチレベルメモリ認識ソフトウェアインタフェースを用いて、データ構造を、マルチクラスメモリシステム１０１のメモリ１０６，１０７，１０８，１０９に選択的に割り当ててもよいし、異なるメモリレベルからのメモリページの自身のプールを維持してもよく、データ構造が適切であると判断すると、これらのページへのデータ構造の割り当てを明示的に処理してもよい。ライブラリ１２０は、メモリ割り当てを透過的に管理する任意のライブラリ（例えば、Ｃ＋＋標準テンプレートライブラリ（ＳＴＬ）、Ｊａｖａ（登録商標）標準ライブラリ、Ｃ♯及び.ＮＥＴ  Ｆｒａｍｅｗｏｒｋ、カスタムライブラリ、ドメイン固有のライブラリ等）であってもよい。
【００３１】
ブロック５０６では、ライブラリ１２０は、例えば、メモリ割り当て関数呼び出しと共に含まれる１つ以上のパラメータ１３６、ヒューリスティックス等に基づいて、データ構造１２８のタイプを識別する。少なくとも１つの実施形態においては、ライブラリ１２０は、データ構造タイプテーブル１３０を参照して、データ構造１２８のマルチクラスメモリシステム１０１のメモリ１０６，１０７，１０８，１０９への割り当てに関する情報を決定する。例えば、ライブラリ１２０は、ブロック５０８に従って、タイプテーブル１３０を用いて、データ構造１２８の各部分を識別してもよい。ライブラリ１２０は、データ構造タイプに基づいて、データ構造１２８の各部分１３２，１３４を識別する。いくつかの実施形態においては、ライブラリ１２０は、プログラム１２４によって提供された１つ以上の複数のパラメータ１３６に基づいて、データ構造１２８の各部分１３２，１３４を識別する。各部分は、アクセス頻度、データサイズ等に基づいて決定されてもよい。ライブラリ１２０は、各部分１３２，１３４に基づいて、データ構造１２８をどのように割り当てるのかを、オペレーティングシステム１２１に示す。
【００３２】
ブロック５１０では、オペレーティングシステム１２１は、データ構造の各部分１３２，１３４を、マルチクラスメモリシステム１０１の複数のメモリ１０６，１０９に割り当てる。割り当ては、データ構造のタイプの動的アクセスパターンに基づく決定（例えば、より頻繁に使用する部分を、より速いアクセスタイムを有するメモリに割り当てるべきである）、各メモリ１０６，１０７，１０８，１０９又はクラスの利用可能なメモリの量に基づく決定（例えば、利用可能なメモリ空間がある限り、データ構造１２８のうち可能な限り多くの部分を、より速いアクセスタイムのメモリに割り当てるべきである）、又は、これらの組み合わせ等に基づく決定等を行ってもよい。少なくとも１つの実施形態においては、各部分１３２，１３４は、データ構造１２８のメタデータ及びデータを表し、メタデータ部分１３２は、複数のメモリ１０６，１０７，１０８，１０９のうち第１のセットのメモリ１０６に割り当てられ、データ部分１３４は、複数のメモリ１０６，１０７，１０８，１０９のうち第２のセットのメモリ１０９に割り当てられる。かかる割り当ては、メタデータがデータ構造１２８のデータより小さいため、メタデータがデータより頻繁にアクセスされるため、又は、これらの組み合わせ等の理由によってプロセッサ１０２の性能を向上させるために行われてもよい。 
【００３３】
図６は、いくつかの実施形態に係る、データ構造１２８を、マルチクラスメモリシステム１０１のメモリ１０６，１０７，１０８，１０９に割り当てるためのメモリ割り当てを行う図１の処理システム１００のブロック図である。図示した実施形態においては、ライブラリ６２０は、ソフトウェア６２４に対してインタフェースを提供し、メモリ位置情報やプリファレンス等を、基本システムソフトウェア（例えば、オペレーティングソフトウェア（ＯＳ）、ハイパーバイザ等）に通信する。すなわち、ライブラリは、ＡＰＩ６２２を介して、データ構造、アルゴリズム及び他のサービスを提供し、プログラマ又は他のユーザは、関数呼び出し６０２，６０４を用いて、オペレーティングシステム６２１が、データ構造１２８を、マルチクラスメモリシステム１０１のメモリ１０６，１０７，１０８，１０９にどのように割り当てるべきかを示してもよい。例えば、少なくとも１つの実施形態においては、ＡＰＩ６２２は、各メモリ１０６，１０７，１０８，１０９の関数呼び出し６０２、各メモリクラス（Ｉ，ＩＩ）、各メモリレベル、又は、各メモリタイプを含む。関数呼び出し６０２は、メモリ割り当てをメモリ１０６に示すメモリインジケータ（「Ｉ―１」として示す）を含む。関数呼び出し６０２は、何れのデータ構造又は他のメモリオブジェクトを当該メモリ１０６に割り当てるか、データサイズ基準、どのメモリ（関数呼び出しメモリインジケータが特定のメモリではなく、メモリクラス、レベル又はタイプを示す場合）か等を示すパラメータをさらに含んでもよい。
【００３４】
ある実施形態においては、ＡＰＩ６２２は、一般的なメモリ割り当て関数呼び出し６０４を含み、当該呼び出し６０４は、割り当てられるデータ構造１２８(関数呼び出し６０４では「ＤＳ」として示される)と、当該データ構造１２８を何れのメモリ１０６に割り当てるのかを示すメモリインジケータ（「Ｉ―１」）と、を含むパラメータを受け入れる。いくつかの実施形態においては、メモリインジケータ（「Ｉ―１」）は、メモリクラス（Ｉ，ＩＩ）、複数のメモリ、複数のメモリクラス等を示してもよい。さらに、異なる実施形態では、例えば、データ構造タイプ、データ構造部分、割り当てサイズ制限等の任意の数のパラメータを許容又は必要としてもよい。図示したように、プロセッサコア１１１は、ＡＰＩ６２２を介して、ライブラリ６２０へのメモリ割り当て関数呼び出し６０２，６０４，６０６の何れかを含むソフトウェアプログラム６２４を実行する場合、ライブラリ６２０は、オペレーティングシステム６２１が、データ構造１２８を、メモリインジケータ（「Ｉ―１」）によって識別されたメモリ１０６に割り当てることを示す。図示した実施形態では、メモリ割り当て関数呼び出し６０２，６０４に関して標準Ｃライブラリ「malloc」を使用しているが、これらの技術は、他のプログラミング言語及びそれらの各メモリ割り当てインタフェースにも容易に適用され得る。いくつかの実施形態においては、ディレクティブ６０６、又は、他の注釈のようなシンタックスを用いて、メモリインジケータを介して、特定のメモリ又はメモリクラスをコンパイラに直接指定することによって、メモリ割り当てを指定する。例えば、いくつかの実施形態においては、ディレクティブ６０６がコンパイラによって処理され、情報は、ライブラリ６２０又はオペレーティングシステム６２１に渡される。
【００３５】
異なる実施形態は、割り当ての処理に対して異なる規定を用いてもよい。例えば、いくつかの実施形態においては、関数呼び出し６０２，６０４又はディレクティブ６０６のメモリインジケータによって指定されたメモリ割り当てが厳しい要件であって、示されたメモリ１０６が、メモリ割り当て要求を満たすメモリ空間を十分に持たない場合には、割り当てが失敗する（例えば、関数呼び出し６０２，６０４によって、「Ｉ―１」メモリインジケータと共に「ＮＵＬＬ」ポインタが返されてもよい）。他の実施形態においては、関数呼び出し６０２，６０４又はディレクティブ６０６によって指定されたメモリ割り当ては、むしろ提案として扱われ、示されたメモリ１０６が、メモリ割り当て要求を満たすのに十分なメモリ空間を持たない場合には、オペレーティングシステム６２１は、データ構造１２８を、例えば、他のヒューリスティックスに従って割り当てたり、任意に割り当てる等のように、指定されたもの以外の方法で割り当てる。少なくとも１つの実施形態においては、関数呼び出し又はディレクティブによって指定されたメモリ割り当てに従わない場合には、処理システム１００は、実際の割り当てに関する追加の情報をプログラマ又は他のユーザに返信する。
【００３６】
ライブラリ６２０のいくつかの実施形態では、既存の割り当てを新しいレベルのメモリに再割り当てすること（オプションで、同時に割り当てのサイズを変更すること）をＯＳに命令（提案）する「realloc」又は「remap」関数呼び出しを提供する。変形例として、既存のメモリ割り当てのサブセット又は領域への再マッピングを可能にするインタフェースを含んでもよい。さらに、ライブラリ６２０のいくつかの実施形態では、追加のインタフェース関数を提供して、割り当てが何処から来たのかを区別するのをサポートする。例えば、一実施形態においては、関数呼び出し「typewhichMemory(ptr)」は、「ptr」がメモリ１０６の物理メモリ位置と関連付けられている場合に、「Ｉ―ｌ」を返す。いくつかの実施形態においては、これらのメモリ割り当て技術は、不均等メモリアクセス（ＮＵＭＡ）ベースのメモリ割り当てスキームと組み合わせて用いられる。
【００３７】
図７は、ある実施形態に係る、マルチクラスメモリシステムのメモリ間でデータ構造をメモリに割り当てる例示的な方法７００を示すフロー図である。参照の容易さのために、方法７００は、図６のマルチクラスメモリシステム１０１の例示的なコンテキストにおいて以下に記載する。方法７００は、ブロック７０２で開始し、これにより、処理システム１００は、プロセッサコア１１１が、データ構造１２８をメモリに割り当てるために、ライブラリ６２０へのメモリ割り当て関数呼び出し６０２，６０４を含むソフトウェアプログラム６２４を実行する場合に、メモリ割り当て関数呼び出し６０２，６０４を受信する。
【００３８】
ブロック７０４では、処理システム１００は、ＡＰＩ６２２を介してライブラリ６２０にアクセスする。ライブラリ６２０は、メモリ位置情報やプリファレンス等を基本システムソフトウェアに通信するソフトウェア６２４のインタフェースとして機能するように、データ構造、アルゴリズム及び他のサービスを、ＡＰＩ６２２を介してプログラマ又は他のユーザに提供する。従って、ライブラリ６２０は、プログラマ又は他のユーザが関数呼び出しを介してメモリ割り当てを指定するのを促進する。
【００３９】
ブロック７０６では、処理システム１００は、関数呼び出し６０２，６０４のメモリインジケータ（図６に「Ｉ−１」として示す）を識別して、割り当てに指定された位置を決定する。例えば、メモリインジケータ(「Ｉ−１」)は、１つ以上のメモリ１０６，１０７，１０８，１０９、１つ以上のクラス（Ｉ，ＩＩ）、１つ以上のメモリレベル、１つ以上のメモリタイプ等を指定してもよい。メモリインジケータ（「Ｉ−１」）は、関数呼び出しを介して渡されたパラメータ、関数呼び出しとは別のシンタックスインデックス、又は、関数呼び出し自体を含んでもよい。
【００４０】
ブロック７０８では、処理システム１００は、関数呼び出し１２６のパラメータに基づいて、データ構造１２８の各部分を識別する。いくつかの実施形態においては、パラメータは、データ構造１２８のタイプ、各部分の境界、各部分のデータサイズ、各部分のデータタイプ等を識別することによって、データ構造１２８の各部分を指定してもよい。データ構造１２８は、単一の部分がデータ構造１２８全体を表す場合を含む、任意のサイズの任意の数のデータ部分に分けられてもよい。
【００４１】
ブロック７１０では、オペレーティングシステム６２１は、メモリインジケータ（「Ｉ−１」）に基づいて、データ構造１２８の各部分を、マルチクラスメモリシステム１０１の複数のメモリ１０６，１０７，１０８，１０９に割り当てる。例えば、オペレーティングシステム６２１は、メモリインジケータ「Ｉ−１」及びパラメータ「ＤＳ」を含む関数呼び出し６０４に応じて、データ構造１２８全体を、クラスＩの第１のメモリ１０６に割り当てる。いくつかの実施形態においては、処理システム１００は、関数呼び出し６０２，６０４と、その指定されたメモリインジケータ「Ｉ−１」及びパラメータを、要件ではなく提案として扱ってもよい。一般的に、方法７００は、プログラマ又は他のユーザ（アプリケーションソフトウェアを含む)が、メモリインジケータを含む関数呼び出し又はディレクティブを用いて、マルチクラスメモリシステムの複数のメモリ間のデータ構造の割り当てを管理可能にすることによって、マルチクラスメモリシステムの効率的な活用を促進する。
【００４２】
いくつかの実施形態では、前述した技術の一定の態様は、ソフトウェアを実行する処理システムの１つ以上のプロセッサによって実行されてもよい。ソフトウェアは、非一時的なコンピュータ可読記憶媒体上に記憶又は有形に具体化された１つ以上のセットの実行可能命令を含む。ソフトウェアは、命令及び一定のデータを含むことができ、当該命令及びデータは、１つ以上のプロセッサによって実行されると、１つ以上のプロセッサが上記の技術の１つ以上の態様を実行するように操作する。非一時的コンピュータ可読記憶媒体は、例えば、磁気若しくは光学ディスク記憶装置、フラッシュメモリ、キャッシュ、ランダムアクセスメモリ（ＲＡＭ）等のソリッドステート記憶装置、又は、他の不揮発性メモリ装置等を含み得る。非一時的コンピュータ可読記憶媒体に記憶された実行可能命令は、ソースコード、アセンブリ言語コード、オブジェクトコード、又は、１つ以上のプロセッサによって解釈される若しくは実行可能な他の命令フォーマットであってもよい。
【００４３】
概略的に記載した上記行動又は要素は、全て必要なわけではなく、特定の行動または装置の一部が必須でなくてもよい。上記のものに加えて、１つ以上のさらなる行動を行ってもよく、要素を含み得ることに注意されたい。さらに、行動の列挙順は、必ずしも行動の実行順序ではない。また、特定の実施形態を参照して概念を説明したが、当業者は、請求項に記載の本開示の範囲を逸脱することなく、様々な修正及び変更を行い得ることを理解するであろう。従って、明細書及び図面は、限定的な意味ではなく例示的なものとみなすべきであり、かかる修正は、全て、本開示の範囲内に含まれるものとする。
【００４４】
利点、他の長所、及び、課題の解決手段を特定の実施形態に関連して述べてきたが、当該利点、長所、課題の解決手段と、任意の利点、長所、解決手段を生じさせ、若しくは、より明白にする任意の特徴と、は、何れか又は全ての請求項の重要、必要又は必須の特徴とみなすべきではない。さらに、上述した特定の実施形態は、例示目的のみであり、開示した発明の主題は、本明細書の教示の利点を有する、当業者に明らかな、異なるが同等の方法で修正及び実践されてよい。請求項に別段の記載のない限り、本明細書に示した構造又は設計の詳細に限定する意図はない。よって、上記に開示の特定の実施形態を変更、修正してもよく、かかる全ての変形は、開示の発明の主題の範囲内とみなされることは、明らかである。従って、本明細書で求める保護範囲は、請求項に記載される通りである。
【図１】
2017517792.tif 000003
【図２】
2017517792.tif 000004
【図３】
2017517792.tif 000005
【図４】
2017517792.tif 000006
【図５】
2017517792.tif 000007
【図６】
2017517792.tif 000008
【図７】
2017517792.tif 000009
【手続補正書】
【提出日】平成28年12月1日(2016.12.1)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
マルチクラスメモリシステムにおいて、データ構造をメモリに割り当てるための、ライブラリへのメモリ割り当て関数呼び出しに応じて、
前記マルチクラスメモリシステムのプロセッサにおいて、前記データ構造のタイプを識別することと、
前記マルチクラスメモリシステムの前記プロセッサにおいて、前記ライブラリを用いて、前記データ構造の前記タイプに基づいて、前記データ構造の各部分を前記マルチクラスメモリシステムの複数のメモリに割り当てることと、を含む、
方法。
【請求項２】
前記データ構造の各部分を複数のメモリに割り当てることは、
前記データ構造のメタデータを、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記データ構造のデータを、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、をさらに含む、
請求項１に記載の方法。
【請求項３】
前記第１のセットの１つ以上のメモリは、前記第２のセットの１つ以上のメモリよりも速いアクセスを提供する、
請求項２に記載の方法。
【請求項４】
前記データ構造は、順序付けされたデータ構造を含み、
前記順序付けされたデータ構造の各部分を割り当てることは、
前記順序付けされたデータ構造の最初の部分を、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記順序付けされたデータ構造の最後の部分を、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、を含む、
請求項１に記載の方法。
【請求項５】
前記順序付けされたデータ構造は、木構造を含み、
前記順序付けされたデータ構造の前記最初の部分は、前記木構造の最初のレベルのノードを含み、
前記順序付けされたデータ構造の前記最後の部分は、前記木構造の最後のレベルのノードを含む、
請求項４に記載の方法。
【請求項６】
前記マルチクラスメモリシステムの前記プロセッサにおいて、アプリケーションプログラミングインタフェース（ＡＰＩ）を介して前記メモリ割り当て関数呼び出しを受信すること、を含む、
請求項１に記載の方法。
【請求項７】
前記メモリ割り当て関数呼び出しは、複数のパラメータをさらに含み、
前記データ構造の各部分を前記マルチクラスメモリシステムの複数のメモリに割り当てることは、
前記複数のパラメータに基づいて、前記データ構造の各部分を、前記マルチクラスメモリシステムの複数のメモリに割り当てることをさらに含む、
請求項１に記載の方法。
【請求項８】
前記データ構造は、リンクリストを含み、
前記データ構造の各部分を前記マルチクラスメモリシステムの複数のメモリに割り当てることは、
前記リンクリストの最初のセグメントを、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記リンクリストの最後のセグメントを、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、をさらに含み、
前記第１のセットの１つ以上のメモリは、前記第２のセットの１つ以上のメモリよりも速いアクセスを提供する、
請求項１に記載の方法。
【請求項９】
前記データ構造は、マップ構造を含み、
前記データ構造の各部分を前記マルチクラスメモリシステムの複数のメモリに割り当てることは、
前記マップ構造のキー部分を、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記マップ構造の値部分を、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、をさらに含み、
前記第１のセットの１つ以上のメモリは、前記第２のセットの１つ以上のメモリよりも速いアクセスを提供する、
請求項１に記載の方法。
【請求項１０】
前記データ構造は、グラフ構造を含み、
前記データ構造の各部分を前記マルチクラスメモリシステムの複数のメモリに割り当てることは、
グラフ構造のノードメタデータを、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記グラフ構造のノードデータ部分を、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、を含み、
前記第１のセットの１つ以上のメモリは、前記第２のセットの１つ以上のメモリよりも速いアクセスを提供する、
請求項１に記載の方法。
【請求項１１】
ライブラリを記憶するライブラリストアと、
統合メモリアドレス空間を共有する複数のメモリに結合可能なプロセッサと、を備え、
前記プロセッサは、
データ構造をメモリに割り当てるための、前記ライブラリへのメモリ割り当て関数呼び出しに応じて、
前記データ構造のタイプを識別し、
前記ライブラリを用いて、前記データ構造の各部分を、前記データ構造の前記タイプに基づいて、前記複数のメモリのうち複数のメモリ間で割り当てる、
システム。
【請求項１２】
前記プロセッサは、
前記データ構造のメタデータを、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記データ構造のデータを、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、
によって、前記データ構造の各部分を複数のメモリ間で割り当てる、
請求項１１に記載のシステム。
【請求項１３】
前記第１のセットの１つ以上のメモリは、前記第２のセットの１つ以上のメモリよりも速いアクセスを提供する、
請求項１２に記載のシステム。
【請求項１４】
前記プロセッサは、アプリケーションプログラミングインタフェース（ＡＰＩ）を介して前記メモリ割り当て関数呼び出しを受信する、
請求項１１に記載のシステム。
【請求項１５】
前記メモリ割り当て関数呼び出しは、複数のパラメータをさらに含み、
前記プロセッサは、前記データ構造の各部分を、前記複数のパラメータに基づいて、前記複数のメモリのうち複数のメモリに割り当てることによって、前記データ構造の各部分を、前記複数のメモリのうち複数のメモリに割り当てる、
請求項１１に記載のシステム。 
【請求項１６】
前記データ構造は、リンクリストを含み、
前記プロセッサは、
前記リンクリストの最初のセグメントを、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記リンクリストの最後のセグメントを、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、
によって、前記データ構造の各部分を、前記複数のメモリのうち複数のメモリに割り当て、
前記第１のセットの１つ以上のメモリは、前記第２のセットの１つ以上のメモリよりも速いアクセスを提供する、
請求項１１に記載のシステム。
【請求項１７】
前記データ構造は、マップ構造を含み、
前記プロセッサは、
前記マップ構造のキー部分を、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記マップ構造の値部分を、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、
によって、前記データ構造の各部分を、前記複数のメモリのうち複数のメモリに割り当て、
前記第１のセットの１つ以上のメモリは、前記第２のセットの１つ以上のメモリよりも速いアクセスを提供する、
請求項１１に記載のシステム。
【請求項１８】
前記データ構造は、グラフ構造を含み、
前記プロセッサは、
前記グラフ構造のノードメタデータを、前記複数のメモリのうち第１のセットの１つ以上のメモリに割り当てることと、
前記グラフ構造のノードデータ部分を、前記複数のメモリのうち第２のセットの１つ以上のメモリに割り当てることと、
によって、前記データ構造の各部分を、前記複数のメモリのうち複数のメモリに割り当て、
前記第１のセットの１つ以上のメモリは、前記第２のセットの１つ以上のメモリよりも速いアクセスを提供する、
請求項１１に記載のシステム。
【国際調査報告】
2017517792.tif 000010
2017517792.tif 000011