(57)【要約】ＯｐｅｎＣＬ（登録商標）フレームワーク内にライブラリを提供するためのシステム、方法及び媒体である。ライブラリソースコードは、中間表現にコンパイルされ、エンドユーザのコンピューティングシステムに配信される。コンピューティングシステムは、典型的に、ＣＰＵと、１つ以上のＧＰＵとを含む。ＣＰＵは、ライブラリの中間表現を、ＧＰＵ上で実行することをターゲットとした実行可能なバイナリにコンパイルする。ＣＰＵは、ホストアプリケーションを実行し、ホストアプリケーションは、バイナリからカーネルを呼び出す。ＣＰＵは、バイナリからカーネルを検索し、カーネルを実行のためにＧＰＵに伝達する。【選択図】図５
2015503161.tif 000002
【特許請求の範囲】
【請求項１】
ホストプロセッサと、
前記ホストプロセッサに結合されたターゲットプロセッサと、を備え、
前記ホストプロセッサは、
予めコンパイルされたライブラリを受信し、前記予めコンパイルされたライブラリは、前記ホストプロセッサに受信される前に、ソースコードから第１の中間表現にコンパイルされており、
前記予めコンパイルされたライブラリを、前記第１の中間表現からバイナリにコンパイルし、前記バイナリは、前記ターゲットプロセッサによって実行可能な１つ以上のカーネルを含み、
前記バイナリをメモリに格納する、ように構成されており、
前記カーネルは、前記バイナリの所与のカーネルに関する要求の検出に応じて、前記ターゲットプロセッサによる実行のために提供される、
システム。
【請求項２】
前記ターゲットプロセッサによる実行のための前記カーネルの提供は、前記ターゲットプロセッサが前記カーネルを格納場所から検索すること、又は、前記ホストプロセッサが前記カーネルを前記ターゲットプロセッサに伝達することを含む、請求項１に記載のシステム。
【請求項３】
前記ホストプロセッサは、オープンコンピューティング言語（ＯｐｅｎＣＬ）ランタイム環境を動作させ、
前記バイナリを開くことは、前記バイナリに対応するマスターインデックステーブルを、前記ホストプロセッサのメモリにロードすることを含み、
前記バイナリから前記所与のカーネルを検索することは、前記バイナリ内の前記所与のカーネルの場所を判定するために、前記マスターインデックステーブルにおいて前記所与のカーネルを参照することを含む、請求項１に記載のシステム。
【請求項４】
前記ホストプロセッサは中央処理装置（ＣＰＵ）であり、前記ターゲットプロセッサはグラフィックス処理ユニット（ＧＰＵ）であり、前記ＧＰＵは複数の処理要素を含む、請求項１に記載のシステム。
【請求項５】
前記ソースコードは、オープンコンピューティング言語（ＯｐｅｎＣＬ）で記述されている、請求項１に記載のシステム。
【請求項６】
前記予めコンパイルされたライブラリを、第１の中間表現からバイナリにコンパイルすることは、前記第１の中間表現を第２の中間表現にコンパイルすることと、前記第２の中間表現を前記バイナリにコンパイルすることとを含む、請求項１に記載のシステム。
【請求項７】
前記予めコンパイルされたライブラリの前記第１の中間表現は暗号化されており、
前記ホストプロセッサは、前記第１の中間表現をバイナリにコンパイルする前に、前記第１の中間表現を復号化するように構成されている、請求項１に記載のシステム。
【請求項８】
前記第１の中間表現は、低レベル仮想機械（ＬＬＶＭ）中間表現である、請求項１に記載のシステム。
【請求項９】
ライブラリの中間表現を、特定のターゲットプロセッサをターゲットとするバイナリにコンパイルすることと、
カーネルに関する要求の検出に応じて、前記バイナリから前記カーネルを検索することと、
前記特定のターゲットプロセッサ上で前記カーネルを実行することと、
を含む、方法。
【請求項１０】
前記バイナリからカーネルを検索することは、
前記バイナリに対応するマスターインデックステーブルを前記ＣＰＵのメモリにロードすることと、
前記マスターインデックステーブルから前記カーネルに関する場所情報を検索することと、
を含む、請求項９に記載の方法。
【請求項１１】
前記特定のターゲットプロセッサは、グラフィックス処理ユニット（ＧＰＵ）である、請求項９に記載の方法。
【請求項１２】
前記ライブラリは複数のカーネルを備えている、請求項９に記載の方法。
【請求項１３】
前記ライブラリは、オープンコンピューティング言語（ＯｐｅｎＣＬ）で記述されたソースコードを含む、請求項９に記載の方法。
【請求項１４】
前記ＩＲは、低レベル仮想機械（ＬＬＶＭ）ＩＲを含み、
前記方法は、前記ＬＬＶＭ  ＩＲを中間言語（ＩＬ）表現にコンパイルすることと、前記ＩＬ表現を前記バイナリにコンパイルすることとを含む、請求項９に記載の方法。
【請求項１５】
前記ＩＲは、前記カーネルに関する要求を検出する前に、バイナリにコンパイルされる、請求項９に記載の方法。
【請求項１６】
前記ＩＲは、前記ターゲットプロセッサによって実行可能ではない、請求項９に記載の方法。
【請求項１７】
プログラム命令を備えるコンピュータ可読記憶媒体であって、
前記プログラム命令は、実行されると、
予めコンパイルされたライブラリを受信し、前記予めコンパイルされたライブラリは、受信される前にソースコードから第１の中間表現にコンパイルされており、
前記予めコンパイルされたライブラリを、前記第１の中間表現からバイナリにコンパイルし、前記バイナリは、ターゲットプロセッサによって直接実行可能な１つ以上のカーネルを含み、
前記バイナリをメモリに格納し、
前記バイナリの所与のカーネルに関する要求の検出に応じて、前記バイナリを開き、前記バイナリから前記所与のカーネルを検索し、前記所与のカーネルを実行のために前記ターゲットプロセッサに提供する、
ように動作可能である、
コンピュータ可読記憶媒体。
【請求項１８】
前記ターゲットプロセッサは、グラフィックス処理ユニット（ＧＰＵ）である、請求項１７に記載のコンピュータ可読記憶媒体。
【請求項１９】
前記ソースコードはオープンコンピューティング言語（ＯｐｅｎＣＬ）で記述されている、請求項１７に記載のコンピュータ可読記憶媒体。
【請求項２０】
前記第１の中間表現は、前記バイナリの所与のカーネルに関する要求を検出する前に、バイナリにコンパイルされる、請求項１７に記載のコンピュータ可読記憶媒体。
【請求項２１】
前記予めコンパイルされたライブラリを、第１の中間表現からバイナリにコンパイルすることは、前記第１の中間表現を第２の中間表現にコンパイルすることと、前記第２の中間表現を前記バイナリにコンパイルすることとを含む、請求項１７に記載のコンピュータ可読記憶媒体。
【請求項２２】
前記第１の中間表現は、低レベル仮想機械（ＬＬＶＭ）中間表現である、請求項１７に記載のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、概して、コンピュータ及びソフトウェアに関し、特に、種々の異なる並列ハードウェアプラットフォームのためのソフトウェアライブラリを抽象化することに関する。
【背景技術】
【０００２】
コンピュータ及び他のデータ処理デバイスは、典型的に、中央処理装置（ＣＰＵ）として一般に知られている少なくとも１つの制御プロセッサを有する。また、こうしたコンピュータ及びデバイスは、種々のタイプの特化された処理に用いられるグラフィックス処理ユニット（ＧＰＵ）などの他のプロセッサを有し得る。例えば、第１のアプリケーションセットにおいて、ＧＰＵは、グラフィックス処理動作を行うように設計され得る。ＧＰＵは、一般に、並列データストリームに対して同じ命令を実行することの可能な複数の処理要素を含む。一般に、ＣＰＵは、ホストとして機能し、特化された並列タスクを、ＧＰＵなどの他のプロセッサに委ねることがある。
【０００３】
ＣＰＵ及びＧＰＵを有するヘテロジニアスコンピューティングプラットフォームのためのいくつかのフレームワークが開発されている。これらのフレームワークは、スタンフォード大学によるＢｒｏｏｋＧＰＵや、ＮＶＩＤＩＡによるＣＵＤＡや、Ｋｈｒｏｎｏｓ  Ｇｒｏｕｐと呼ばれる産業団体によるＯｐｅｎＣＬ（登録商標）を含む。ＯｐｅｎＣＬ（登録商標）フレームワークは、種々の異なるタイプのＣＰＵ、ＧＰＵ、デジタル信号プロセッサ（ＤＳＰ）及び他のプロセッサ上で実行するアプリケーションをユーザが作成可能なＣ−ｌｉｋｅ開発環境を提供する。また、ＯｐｅｎＣＬ（登録商標）は、ヘテロジニアスコンピューティングシステム内でコードをコンパイル及び実行することの可能なコンパイラ及びランタイム環境を提供する。開発者は、ＯｐｅｎＣＬ（登録商標）を使用しているときに、現在使用されている全てのプロセッサをターゲットとするために、単一の統一されたツールチェーン及び言語を使用することができる。これは、これらのアーキテクチャの全てを同様の方法で概念化する抽象型プラットフォームモデルと、ヘテロジニアスアーキテクチャにわたるデータ及びタスクの並列性をサポートする実行モデルとを、開発者に提示することによってなされる。
【０００４】
ＯｐｅｎＣＬ（登録商標）は、これまでグラフィックスアプリケーションでのみ利用可能であった多くのコンピューティングプラットフォームに含まれていた莫大なＧＰＵコンピューティングパワーを、任意のアプリケーションによって活用できるようにする。ＯｐｅｎＣＬ（登録商標）を用いて、ベンダーがＯｐｅｎＣＬ（登録商標）ドライバを提供した任意のＧＰＵ上で実行するプログラムを書き込むことができる。ＯｐｅｎＣＬ（登録商標）プログラムが実行されると、一連のＡＰＩコールがシステムを実行用に構成し、組み込み実行時（Ｊｕｓｔ  Ｉｎ  Ｔｉｍｅ：ＪＩＴ）コンパイラがＯｐｅｎＣＬ（登録商標）コードをコンパイルし、ランタイムが並列カーネル間の実行を非同期的に協調させる。タスクは、ホスト（例えば、ＣＰＵ）から同じシステム内のアクセラレータデバイス（例えば、ＧＰＵ）にオフロードされ得る。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
典型的なＯｐｅｎＣＬ（登録商標）ベースのシステムは、ソースコードを取得し、ソースコードを、ＪＩＴコンパイラを通じて実行して、ターゲットＧＰＵに関する実行可能コードを生成し得る。次いで、実行可能コード又は実行可能コードの一部は、ターゲットＧＰＵに送信され、実行される。しかしながら、この手法では、時間がかかりすぎることがあり、ＯｐｅｎＣＬ（登録商標）ソースコードを露出することがある。したがって、当該技術分野では、ライブラリを生成するのに用いられるソースコードを露出せずにＯｐｅｎＣＬ（登録商標）ランタイム環境内のアプリケーションにソフトウェアライブラリを提供するためのＯｐｅｎＣＬ（登録商標）ベースの手法が必要とされている。
【課題を解決するための手段】
【０００６】
一実施形態では、ソースコード及びソースライブラリは、高レベルソフトウェア言語から特定のターゲットハードウェア上で実行可能なカーネルを含む命令セットアーキテクチャ（ＩＳＡ）バイナリに至るまでにいくつかのコンパイルステージを経由してもよい。一実施形態では、ソースコード及びライブラリの高レベルソフトウェア言語は、オープンコンピューティング言語（ＯｐｅｎＣＬ（登録商標））であってもよい。各ソースライブラリは、ＣＰＵ上で実行しているソフトウェアアプリケーションから呼び出され得る、及び、実際の実行のためにＧＰＵに伝達され得る、複数のカーネルを含んでもよい。
【０００７】
ライブラリソースコードは、エンドユーザのコンピューティングシステムに伝達される前に、中間表現にコンパイルされてもよい。一実施形態では、中間表現は、低レベル仮想機械（ｌｏｗ  ｌｅｖｅｌ  ｖｉｒｔｕａｌ  ｍａｃｈｉｎｅ：ＬＬＶＭ）中間表現であってもよい。中間表現は、ソフトウェアインストレーションパッケージの一部としてエンドユーザのコンピューティングシステムに提供されてもよい。インストール時に、ＬＬＶＭファイルは、所与のエンドユーザのコンピューティングシステムの特定のターゲットハードウェア用にコンパイルされてもよい。所与のコンピューティングシステムにおけるＣＰＵ又は他のホストデバイスは、システム内のＧＰＵなどのハードウェアターゲットのためのＩＳＡバイナリを生成するために、ＬＬＶＭファイルをコンパイルしてもよい。
【０００８】
実行時に、ＩＳＡバイナリは、適正なインストールを確認し得るソフトウェア開発キット（ｓｏｆｔｗａｒｅ  ｄｅｖｅｌｏｐｍｅｎｔ  ｋｉｔ：ＳＤＫ）であって、ＩＳＡバイナリから１つ以上の特定のカーネルを検索し得るＳＤＫを介して開かれてもよい。カーネルは、次いで、メモリに格納されてもよく、実行しているアプリケーションは、実行のための各カーネルを、ＯｐｅｎＣＬ（登録商標）ランタイム環境を介してＧＰＵに送達してもよい。
【０００９】
これらの特徴及び利点、並びに、他の特徴及び利点は、本明細書で提示される手法の以下の詳細な説明に照らせば、当該技術分野の当業者には明らかとなるであろう。
【００１０】
方法及び機構の上述した利点及び更なる利点は、以下の説明を付属の図面と併せて参照することでより良く理解されるであろう。
【図面の簡単な説明】
【００１１】
【図１】１つ以上の実施形態に係るコンピューティングシステムのブロック図である。
【図２】１つ以上の実施形態に係る分散型コンピューティング環境のブロック図である。
【図３】１つ以上の実施形態に係るＯｐｅｎＣＬ（登録商標）ソフトウェア環境のブロック図である。
【図４】１つ以上の実施形態に係る暗号化されたライブラリのブロック図である。
【図５】別のコンピューティングシステムの一部の実施形態のブロック図である。
【図６】ＯｐｅｎＣＬ（登録商標）環境内にライブラリを提供するための方法の一実施形態を示す、一般化されたフロー図である。
【発明を実施するための形態】
【００１２】
以下の説明では、本明細書で提示される方法及び機構の十分な理解を提供するために、多くの具体的詳細が記載される。しかしながら、当業者は、これらの具体的詳細がなくても、種々の実施形態が実施され得ることを認識するはずである。ある場合には、本明細書に記載の手法を不明瞭にすることを避けるために、周知の構造体、コンポーネント、信号、コンピュータプログラム命令及び技術が詳細に示されていない。例証の簡素さ及び明確さのために、図面に示される要素は必ずしも縮尺で描かれていないことが理解されるであろう。例えば、要素のうちのいくつかの寸法は、他の要素に対して誇張されていることがある。
【００１３】
本明細書は、「一実施形態」への言及を含む。異なる文脈での「一実施形態では」という文言の出現は、必ずしも同じ実施形態を指していない。特定の特徴、構造体又は特色が、本開示と一致するあらゆる適切な方法で組み合わされてもよい。さらに、本願の全体を通して用いられる場合の「〜であってもよい、〜ことがある、〜得る」という言葉は、義務付けの意味（すなわち、しなければならないという意味）ではなく、許容の意味で用いられる（すなわち、可能性を有することを意味する）。同様に、「〜を含む（ｉｎｃｌｕｄｅ、ｉｎｃｌｕｄｅｓ）」、「〜を含んでいる」という言葉は、〜を含むがこれに限定されないことを意味する。
【００１４】
用語。以下のパラグラフは、本開示（添付の請求項を含む）で見られる用語に関する定義及び／又は文脈を提供する。
【００１５】
「〜を備える、含む」。この用語は幅広い解釈ができる。添付の請求項で用いられる場合には、この用語は、付加的な構造体又はステップを除外するものではない。「ホストプロセッサ…を備えるシステム。」と記載する請求項を考える。こうした請求項は、システムが付加的なコンポーネント（例えば、ネットワークインターフェース、メモリ）を含むことを除外するものではない。
【００１６】
「〜ように構成される」。種々のユニット、回路又は他のコンポーネントが、１つ以上のタスクを行う「ように構成される」として説明又は特許請求されることがある。このような文脈では、「〜ように構成される」とは、ユニット／回路／コンポーネントの動作中に１つ以上のタスクを行う構造体（例えば、回路）を含むことを示すことによって、構造体を表すのに用いられる。したがって、ユニット／回路／コンポーネントは、特定のユニット／回路／コンポーネントが現在動作可能ではない（例えば、オンではない）ときであって、もタスクを行うように構成されると言える。「〜ように構成される」という語と共に用いられるユニット／回路／コンポーネントは、ハードウェア（例えば、回路や、動作を実施するように実行可能なプログラム命令を格納するメモリなど）を含む。ユニット／回路／コンポーネントが１つ以上のタスクを行う「ように構成される」という記述は、該ユニット／回路／コンポーネントに対して３５Ｕ．Ｓ．Ｃ．§１１２、第６パラグラフを行使しないことを明確に意図される。加えて、「〜ように構成される」とは、当該タスクを行うことができる態様で動作するソフトウェア及び／又はファームウェア（例えば、ソフトウェアを実行するＦＰＧＡ若しくは汎用プロセッサ）によって取り扱われる一般的な構造体（例えば、一般的な回路）を含むことができる。「〜ように構成される」はまた、製造プロセス（例えば、半導体製造設備）を、１つ以上のタスクを実施又は実行するように適合されるデバイス（例えば、集積回路）を製造することに適合させることを含むことがある。
【００１７】
「第１の」、「第２の」など。本明細書で用いられる場合のこれらの用語は、それらが前につく名詞に対するラベルとして用いられ、そのように明示的に定義されない限りにおいて、どのようなタイプの順序付け（例えば、空間的、一時的、論理的）も意味しない。例えば、４つのＧＰＵを有するシステムでは、「第１の」ＧＰＵ及び「第２の」ＧＰＵという用語は、４つのＧＰＵのうち何れか２つを指すのに用いることができる。
【００１８】
「〜に基づいて」。本明細書で用いられる場合には、この用語は、判定に影響する１つ以上の因子を説明するのに用いられる。この用語は、判定に影響することがある付加的な因子を除外するものではない。すなわち、判定は、これらの因子だけに基づいて、又は、これらの因子に少なくとも部分的に基づいてなされてもよい。「Ｂに基づいてＡを判定する」という文言を考える。Ｂは、Ａの判定に影響する因子であり得るが、こうした文言は、Ａの判定がＣにも基づいていることを除外するものではない。他の場合、Ａは、Ｂだけに基づいて判定されることがある。
【００１９】
ここで図１を参照すると、一実施形態に係るコンピューティングシステム１００のブロック図が示されている。コンピューティングシステム１００は、ＣＰＵ１０２と、ＧＰＵ１０６とを含み、コプロセッサ１０８を任意に含んでもよい。図１に示される実施形態では、ＣＰＵ１０２及びＧＰＵ１０６は、別個の集積回路（ＩＣ）又はパッケージ上に含まれる。しかしながら、他の実施形態では、ＣＰＵ１０２及びＧＰＵ１０６、又は、これらの集合的な機能性は、単一のＩＣ又はパッケージ内に含まれてもよい。一実施形態では、ＧＰＵ１０６は、データ並列アプリケーションの実行をサポートする並列アーキテクチャを有してもよい。
【００２０】
また、コンピューティングシステム１００は、ＣＰＵ１０２と、ＧＰＵ１０６と、コプロセッサ１０８によってアクセスされ得るシステムメモリ１１２とを含む。種々の実施形態では、コンピューティングシステム１００は、スーパーコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、ビデオゲームコンソール、組み込みデバイス、ハンドヘルドデバイス（例えば、モバイル電話、スマートフォン、ＭＰ３プレーヤ、カメラ、ＧＰＳデバイスなど）、又は、ＧＰＵを含む若しくは含むように構成された、いくつかの他のデバイスを含んでもよい。また、図１には具体的に示されないが、コンピューティングシステム１００は、コンピューティングシステム１００のコンテンツ（例えば、グラフィックス、ビデオなど）を表示するためのディスプレイ装置（例えば、陰極線管、液晶ディスプレイ、プラズマディスプレイなど）を含んでもよい。
【００２１】
ＧＰＵ１０６は、いくつかの特化した機能（例えば、グラフィックス処理タスク及びデータ並列汎用計算タスク）を、通常、ＣＰＵ１０２がソフトウェアで実行できるよりも速く行うことによって、ＣＰＵ１０２を支援する。また、コプロセッサ１０８は、ＣＰＵ１０２が種々のタスクを行うことを支援してもよい。コプロセッサ１０８は、浮動小数点コプロセッサ、ＧＰＵ、ビデオ処理ユニット（ＶＰＵ）、ネットワーキングコプロセッサ、並びに、他のタイプのコプロセッサ及びプロセッサを含んでもよいが、これらに限定されない。
【００２２】
ＧＰＵ１０６及びコプロセッサ１０８は、バス１１４を経由してＣＰＵ１０２及びシステムメモリ１１２と通信してもよい。バス１１４は、周辺機器インターフェース（ＰＣＩ）バス、アクセラレーテッドグラフィックスポート（ＡＧＰ）バス、ＰＣＩ  Ｅｘｐｒｅｓｓ（ＰＣＩＥ）バス、若しくは、現在利用可能若しくは将来開発される別のタイプのバスを含む、コンピュータシステムで用いられるどのようなタイプのバス又は通信ファブリックであってもよい。
【００２３】
システムメモリ１１２に加えて、コンピューティングシステム１００は、ローカルメモリ１０４と、ローカルメモリ１１０とをさらに含む。ローカルメモリ１０４は、ＧＰＵ１０６に結合されており、且つ、バス１１４に結合されてもよい。ローカルメモリ１１０は、コプロセッサ１０８に結合されており、且つ、バス１１４に結合されてもよい。ローカルメモリ１０４，１１０の各々は、データがシステムメモリ１１２に格納された場合と比べて、特定のデータ（例えば頻繁に用いられるデータ）に対する高速なアクセスを提供するために、ＧＰＵ１０６及びコプロセッサ１０８を利用可能である。
【００２４】
ここで図２を参照すると、分散型コンピューティング環境の一実施形態を示すブロック図が示されている。ホストアプリケーション２１０は、ホストデバイス２０８上で実行してもよく、ホストデバイス２０８は、１つ以上のＣＰＵ及び／又は他のタイプのプロセッサ（例えば、システム・オン・チップ（ＳｏＣ）、グラフィックス処理ユニット（ＧＰＵ）、フィールド・プログラマブル・ゲート・アレイ（ＦＰＧＡ）、特定用途向け集積回路（ＡＳＩＣ））を含んでもよい。ホストデバイス２０８は、直接接続、バス接続、ローカルエリアネットワーク（ＬＡＮ）接続、インターネット接続などを含む種々のタイプの接続を介して、計算デバイス２０６Ａ〜２０６Ｎの各々に結合されてもよい。また、計算デバイス２０６Ａ〜２０６Ｎのうち１つ以上の計算デバイスは、クラウドコンピューティング環境の一部であってもよい。
【００２５】
計算デバイス２０６Ａ〜２０６Ｎは、ホストデバイス２０８に結合され得る任意の数のコンピューティングシステム及び処理デバイスの代表的なものである。各計算デバイス２０６Ａ〜２０６Ｎは、複数の計算ユニット２０２を含んでもよい。各計算ユニット２０２は、ＧＰＵ、ＣＰＵ、ＦＰＧＡなどの任意の種々のタイプのプロセッサを表わしてもよい。また、各計算ユニット２０２は、複数の処理要素２０４Ａ〜２０４Ｎを含んでもよい。
【００２６】
ホストアプリケーション２１０は、計算デバイス２０６Ａ〜２０６Ｎ上で実行している他のプログラムを監視及び制御してもよい。計算デバイス２０６Ａ〜２０６Ｎ上で実行しているプログラムは、ＯｐｅｎＣＬ（登録商標）カーネルを含んでもよい。一実施形態では、ホストアプリケーション２１０は、ＯｐｅｎＣＬ（登録商標）ランタイム環境内で実行してもよく、計算デバイス２０６Ａ〜２０６Ｎ上で実行しているカーネルを監視してもよい。本明細書で用いられる場合、「カーネル」という用語は、ＯｐｅｎＣＬ（登録商標）フレームワーク内のターゲットデバイス（例えば、ＧＰＵ）上で実行するプログラムにおいて宣言される機能を指すことがある。カーネルに関するソースコードは、ＯｐｅｎＣＬ（登録商標）言語で記述され、実行可能な形式のカーネルを作成するために１つ以上のステップでコンパイルされてもよい。一実施形態では、計算デバイス２０６の計算ユニット２０２によって実行されるべきカーネルは、複数のワークロードに分解されてもよく、ワークロードは、異なる処理要素２０４Ａ〜２０４Ｎに並列に課されてもよい。他の実施形態では、ＯｐｅｎＣＬ（登録商標）以外の他のタイプのランタイム環境が、分散型コンピューティング環境によって用いられてもよい。
【００２７】
ここで図３を参照すると、ＯｐｅｎＣＬ（登録商標）ソフトウェア環境の一実施形態を示すブロック図が示されている。特定のタイプの処理（例えば、ビデオ編集、メディア処理、グラフィックス処理）に特有のソフトウェアライブラリは、コンピューティングシステムのためのインストレーションパッケージにダウンロードされてもよいし、含まれてもよい。ソフトウェアライブラリは、インストレーションパッケージに含まれる前に、ソースコードからデバイスに依存しない中間表現にコンパイルされてもよい。一実施形態では、中間表現（ｉｎｔｅｒｍｅｄｉａｔｅ  ｒｅｐｒｅｓｅｎｔａｔｉｏｎ：ＩＲ）は、ＬＬＶＭ  ＩＲ３０２などの低レベル仮想機械（ＬＬＶＭ）中間表現であってもよい。ＬＬＶＭは、言語に依存しないコンパイラフレームワークに関する業界標準であって、ソースコードの変換に関する共通の低レベルコード表現を定義する。他の実施形態では、他のタイプのＩＲが用いられてもよい。ソースコードの代わりにＬＬＶＭ  ＩＲ３０２を配信することで、意図しないアクセス、又は、オリジナルのソースコードの修正を防ぐことができる。
【００２８】
ＬＬＶＭ  ＩＲ３０２は、種々のタイプのエンドユーザのコンピューティングシステムに関するインストレーションパッケージに含まれてもよい。一実施形態では、ＬＬＶＭ  ＩＲ３０２は、インストール時に、中間言語（ｉｎｔｅｒｍｅｄｉａｔｅ  ｌａｎｇｕａｇｅ：ＩＬ）３０４にコンパイルされてもよい。コンパイラ（図示せず）は、ＬＬＶＭ  ＩＲ３０２からＩＬ３０４を生成してもよい。ＩＬ３０４は、ターゲットデバイス（例えば、ＧＰＵ３１８）に特有の技術的詳細を含んでもよいが、ＩＬ３０４は、ターゲットデバイス上で実行可能でなくてもよい。別の実施形態では、ＩＬ３０４は、ＬＬＶＭ  ＩＲ３０２の代わりにインストレーションパッケージの一部として提供されてもよい。
【００２９】
次いで、ＩＬ３０４は、デバイスに特有のバイナリ３０６にコンパイルされてもよい。バイナリ３０６は、後で用いるためにＣＰＵ３１６によってキャッシュされてもよいし、他の方法でアクセス可能であってもよい。ＩＬ３０４からバイナリ３０６（及びＬＬＶＭ  ＩＲ３０２からＩＬ３０４）を生成するのに用いられるコンパイラは、ＧＰＵ３１８のためのドライバパックの一部としてＣＰＵ３１４に提供されてもよい。本明細書で用いられる場合において「バイナリ」という用語は、コンパイルされた実行可能なバージョンのカーネルのライブラリを指すことがある。バイナリ３０６は、特定のターゲットデバイスをターゲットにしてもよく、カーネルは、バイナリから検索され、特定のターゲットデバイスによって実行されてもよい。第１のターゲットデバイスに関してコンパイルされるバイナリからのカーネルは、第２のターゲットデバイス上で実行可能でなくてもよい。また、バイナリ３０６は、命令セットアーキテクチャ（ｉｎｓｔｒｕｃｔｉｏｎ  ｓｅｔ  ａｒｃｈｉｔｅｃｔｕｒｅ：ＩＳＡ）バイナリと呼ばれることがある。一実施形態では、ＬＬＶＭ  ＩＲ３０２、ＩＬ３０４及びバイナリ３０６は、カーネルデータベース（ｋｅｒｎｅｌ  ｄａｔａｂａｓｅ：ＫＤＢ）ファイル形式で格納されてもよい。例えば、ファイル３０２は、ＬＬＶＭ  ＩＲバージョンのＫＤＢファイルとしてマークされてもよく、ファイル３０４はＩＬバージョンのＫＤＢファイルであってもよく、ファイル３０６はバイナリバージョンのＫＤＢファイルであってもよい。
【００３０】
デバイスに特有のバイナリ３０６は、複数の実行可能なカーネルを含んでもよい。カーネルは、何れかのＧＰＵ３１８に伝送され、実行時（ＪＩＴ）コンパイルステージを経由する必要なしに実行され得るように、既にコンパイルされた実行可能な形態であってもよい。特定のカーネルが、ソフトウェアアプリケーション３１０によってアクセスされるときに、特定のカーネルは、メモリから検索され及び／又はメモリに格納されてもよい。したがって、同じカーネルの将来のアクセスのために、カーネルは、バイナリ３０６から検索されるのではなく、メモリから検索されてもよい。別の実施形態では、カーネルは、カーネルが実行される次の時点でカーネルに迅速にアクセスできるように、ＧＰＵ３１８内のメモリに格納されてもよい。
【００３１】
動的リンクライブラリＳＤＫ．ｄｌｌ３０８を介してバイナリ３０６へのアクセスを提供するために、ソフトウェア開発キット（ＳＤＫ）ライブラリ（．ｌｉｂ）ファイルＳＤＫ．ｌｉｂ３１２がソフトウェアアプリケーション３１０によって用いられてもよい。ＳＤＫ．ｄｌｌ３０８は、実行時にソフトウェアアプリケーション３１０からバイナリ３０６にアクセスするのに用いられてもよく、ＳＤＫ．ｄｌｌ３０８は、ＬＬＶＭ  ＩＲ３０２と共にエンドユーザのコンピューティングシステムに配信されてもよい。ソフトウェアアプリケーション３１０は、適切なＡＰＩコールを行うことによってＳＤＫ．ｄｌｌ３０８を介してバイナリ３０６にアクセスするのにＳＤＫ．ｌｉｂ３１２を用いてもよい。
【００３２】
ＳＤＫ．ｌｉｂ３１２は、バイナリ３０６におけるカーネルにアクセスするための複数の機能を含んでもよい。これらの機能は、オープン機能、ゲットプログラム機能及びクローズ機能を含んでもよい。オープン機能は、バイナリ３０６を開き、バイナリ３０６からＣＰＵ３１６内のメモリにマスターインデックステーブルをロードすることができる。ゲットプログラム機能は、マスターインデックステーブルから単一のカーネルを選択し、バイナリ３０６からＣＰＵ３１６メモリにカーネルをコピーすることができる。クローズ機能は、オープン機能によって用いられるリソースを解放することができる。
【００３３】
一部の実施形態では、ソフトウェアアプリケーション３１０は、オープン機能がコールされるときに、バイナリ３０６が最後のドライバと共にコンパイルされているかどうかを判定してもよい。ＣＰＵ３１６によって新しいドライバがインストールされており、且つ、コンパイラによって以前のドライバからバイナリ３０６がコンパイルされた場合に、オリジナルのＬＬＶＭ  ＩＲ３０２は、新しいバイナリ３０６を作成するために、新しいコンパイラと共に再びコンパイルされてもよい。一実施形態では、呼び出されている個々のカーネルだけが再びコンパイルされてもよい。別の実施形態では、カーネルの全てのライブラリが再びコンパイルされてもよい。さらなる実施形態では、実行時に再コンパイルが行われなくてもよい。代わりに、インストーラは、ＣＰＵ３１６に格納された全てのバイナリを認識してもよく、新しいドライバがインストールされる場合には、インストーラは、ＣＰＵ３１６がビジーではないときに、ＬＬＶＭ  ＩＲ３０２及び任意の他のＬＬＶＭ  ＩＲをバックグラウンドで再コンパイルしてもよい。
【００３４】
一実施形態では、ＣＰＵ３１６は、ＯｐｅｎＣＬ（登録商標）ランタイム環境を動作させてもよい。ソフトウェアアプリケーション３１０は、ＯｐｅｎＣＬ（登録商標）ランタイム環境にアクセスするためのＯｐｅｎＣＬ（登録商標）アプリケーション−プログラミングインターフェース（ＡＰＩ）を含んでもよい。他の実施形態では、ＣＰＵ３１６は、他のタイプのランタイム環境を動作させてもよい。例えば、別の実施形態では、ＤｉｒｅｃｔＣｏｍｐｕｔｅランタイム環境が用いられてもよい。
【００３５】
ここで図４を参照すると、暗号化されたライブラリの一実施形態のブロック図が示されている。ＬＬＶＭ  ＩＲ４０４を生成するためにソースコード４０２がコンパイルされてもよい。ＬＬＶＭ  ＩＲ４０４は、ＣＰＵ４１６に伝達され得る暗号化されたＬＬＶＭ  ＩＲ４０６を生成するのに用いられてもよい。暗号化されたＬＬＶＭ  ＩＲ４０６をエンドユーザに配信することで、ソースコード４０２の付加的な保護を提供することができ、無許可のユーザが、ソースコード４０２の近似物を生成するために、ＬＬＶＭ  ＩＲ４０４をリバースエンジニアリングするのを防ぐことができる。暗号化されたＬＬＶＭ  ＩＲ４０６の作成及び配信は、特定のライブラリ及び特定のインストレーションパッケージのために利用可能なオプションであってもよい。例えば、ソースコード４０２のソフトウェア開発者は、それらのソースコードに関する付加的な保護を提供するために暗号化を用いることを決定してもよい。他の実施形態では、ＩＬバージョンのソースコード４０２がエンドユーザに提供されてもよく、これらの実施形態では、ＩＬファイルは、ターゲットコンピューティングシステムに送達される前に暗号化されてもよい。
【００３６】
暗号化が用いられる場合に、コンパイラ４０８は、暗号化されたＬＬＶＭ  ＩＲファイルを復号化するように構成された組み込みデクリプタ４１０を含んでもよい。コンパイラ４０８は、暗号化されたＬＬＶＭ  ＩＲ４０６を復号化し、次いで、コンパイルを行って、暗号化されていないバイナリ４１４を作成してもよい。バイナリ４１４はメモリ４１２に格納されてもよい。別の実施形態では、暗号化されていないバイナリ４１４は、ＣＰＵ４１６の外部の別のメモリ（図示せず）に格納されてもよい。一部の実施形態では、コンパイラ４０８は、ＬＬＶＭ  ＩＲ４０６からＩＬ表現（図示せず）を生成してもよく、次いで、ＩＬから暗号化されていないバイナリ４１４を生成してもよい。種々の実施形態では、ＬＬＶＭ  ＩＲ４０６が暗号化されていることを示すために、暗号化されたＬＬＶＭ  ＩＲ４０６にフラグが設定されてもよい。
【００３７】
ここで図５を参照すると、別のコンピューティングシステムの一部の一実施形態のブロック図が示されている。ソースコード５０２は、システム５００によって用いられ得る任意の数のライブラリ及びカーネルを表わしてもよい。一実施形態では、ソースコード５０２は、ＬＬＶＭ  ＩＲ５０４にコンパイルされてもよい。ＬＬＶＭ  ＩＲ５０４は、ＧＰＵ５１０Ａ〜５１０Ｎに関して同じであってもよい。一実施形態では、ＬＬＶＭ  ＩＲ５０４は、別個のコンパイラによって中間言語（ＩＬ）表現５０６Ａ〜５０６Ｎにコンパイルされてもよい。ＣＰＵ５１２上で実行している第１のコンパイラ（図示せず）は、ＩＬ５０６Ａを生成してもよく、次いで、ＩＬ５０６Ａは、バイナリ５０８Ａにコンパイルされてもよい。バイナリ５０８Ａは、ＧＰＵ５１０Ａをターゲットにしてもよく、ＧＰＵ５１０Ａは、第１のタイプのマイクロアーキテクチャを有してもよい。同様に、ＣＰＵ５１２上で実行している第２のコンパイラ（図示せず）は、ＩＬ５０６Ｎを生成してもよく、次いで、ＩＬ５０６Ｎは、バイナリ５０８Ｎにコンパイルされてもよい。バイナリ５０８Ｎは、ＧＰＵ５１０Ｎをターゲットにしてもよく、ＧＰＵ５１０Ｎは、ＧＰＵ５１０Ａの第１のタイプのマイクロアーキテクチャとは異なる第２のタイプのマイクロアーキテクチャを有してもよい。
【００３８】
バイナリ５０８Ａ〜５０８Ｎは、生成され得る任意の数のバイナリの代表的なものであり、ＧＰＵ５１０Ａ〜５１０Ｎは、コンピューティングシステム５００に含まれ得る任意の数のＧＰＵの代表的なものである。また、バイナリ５０８Ａ〜５０８Ｎは、任意の数のカーネルを含んでもよく、ソースコード５０２からの異なるカーネルが異なるバイナリ内に含まれてもよい。例えば、ソースコード５０２は複数のカーネルを含んでもよい。第１のカーネルは、ＧＰＵ５１０Ａ上で実行することを意図されてもよく、そのため、第１のカーネルは、ＧＰＵ５１０Ａをターゲットとするバイナリ５０８Ａにコンパイルされてもよい。ソースコード５０２からの第２のカーネルは、ＧＰＵ５１０Ｎ上で実行することを意図されてもよく、そのため、第２のカーネルは、ＧＰＵ５１０Ｎをターゲットとするバイナリ５０８Ｎにコンパイルされてもよい。このプロセスは、任意の数のカーネルがバイナリ５０８Ａ内に含まれ得るように、及び、任意の数のカーネルがバイナリ５０８Ｎ内に含まれ得るように、繰り返されてもよい。ソースコード５０２からの一部のカーネルは、両方のバイナリにコンパイルされ、及び、含まれてもよく、一部のカーネルはバイナリ５０８Ａにのみコンパイルされてもよく、他のカーネルはバイナリ５０８Ｎにのみコンパイルされてもよく、他のカーネルはバイナリ５０８Ａ又はバイナリ５０８Ｎの何れにも含まれなくてもよい。このプロセスは、任意の数のバイナリに関して繰り返されてもよく、各バイナリは、ソースコード５０２由来のカーネルのサブセット又は全てを含んでもよい。他の実施形態では、コンピューティングシステム５００内で他のタイプのデバイス（例えば、ＦＰＧＡ、ＡＳＩＣ）が用いられてもよく、バイナリ５０８Ａ〜５０８Ｎのうち１つ以上のバイナリによってターゲットにされてもよい。
【００３９】
ここで図６を参照すると、ＯｐｅｎＣＬ（登録商標）環境内にライブラリを提供するための方法の一実施形態が示されている。説明目的のために、この実施形態におけるステップは、連続した順序で示されている。後述する方法の種々の実施形態では、説明される要素のうち１つ以上の要素は、同時に、示された順序とは異なる順序で行われてもよく、又は、完全に省略されてもよいことに留意されたい。また、他の付加的な要素が所望に応じて行われてもよい。
【００４０】
方法６００は、ブロック６０５で始まってもよく、次いで、ライブラリのソースコードが中間表現（ＩＲ）にコンパイルされてもよい（ブロック６１０）。一実施形態では、ソースコードはＯｐｅｎＣＬ（登録商標）で記述されてもよい。他の実施形態では、ソースコードは他の言語（例えば、Ｃ、Ｃ＋＋、Ｆｏｒｔｒａｎ）で記述されてもよい。一実施形態では、ＩＲはＬＬＶＭ中間表現であってもよい。他の実施形態では、他のＩＲが用いられてもよい。次に、ＩＲは、コンピューティングシステムに伝達されてもよい（ブロック６２０）。コンピューティングシステムは、１つ以上のＣＰＵ及び１つ以上のＧＰＵを含む複数のプロセッサを含んでもよい。コンピューティングシステムはＩＲをダウンロードしてもよい。ＩＲはインストール・ソフトウェア・パッケージの一部であってもよい。ＩＲをコンピューティングシステムに伝達するための種々の他の方法の何れかが用いられてもよい。
【００４１】
ブロック６２０の後で、ＩＲは、コンピューティングシステムのホストプロセッサによって受信されてもよい（ブロック６３０）。一実施形態では、ホストプロセッサはＣＰＵであってもよい。他の実施形態では、ホストプロセッサは、デジタル信号プロセッサ（ＤＳＰ）、システム・オン・チップ（ＳｏＣ）、マイクロプロセッサ、ＧＰＵなどであってもよい。次いで、ＩＲは、ＣＰＵ上で実行するコンパイラによってバイナリにコンパイルされてもよい（ブロック６４０）。バイナリは、コンピューティングシステム内の特定のターゲットプロセッサ（例えば、ＧＰＵ、ＦＰＧＡ）をターゲットにしてもよい。代替的に、バイナリは、コンピューティングシステムの外部のデバイス又はプロセッサをターゲットにしてもよい。バイナリは複数のカーネルを含んでもよく、各カーネルは、特定のターゲットプロセッサ上で直接実行可能である。一部の実施形態では、カーネルは、並列アーキテクチャと共に、ＧＰＵ又は他のデバイスの並列処理能力を利用する機能であってもよい。バイナリは、ＣＰＵローカルメモリ内、システムメモリ内、又は、別の格納場所に格納されてもよい。
【００４２】
一実施形態では、ＣＰＵは、ソフトウェアアプリケーションを実行してもよく（ブロック６５０）、ソフトウェアアプリケーションは、１つ以上のターゲットプロセッサによって行われるべき特定のタスクをスケジューリングするために、ＯｐｅｎＣＬ（登録商標）ランタイム環境と相互作用してもよい。これらのタスクを行うために、ソフトウェアアプリケーションは、バイナリからカーネルに対応する１つ以上の機能へのコールを呼び出してもよい。機能コールを実行するときに、アプリケーションによってカーネルに関する要求が生成されてもよい（条件ブロック６６０）。カーネルに関する要求の生成に応答して、アプリケーションは、バイナリからカーネルを検索するために１つ以上のＡＰＩコールを呼び出してもよい（ブロック６７０）。
【００４３】
カーネルに関する要求が生成されない場合（条件ブロック６６０）、ソフトウェアアプリケーションは、自身の実行を続けてもよく、カーネルへの要求が生成されるときに応答できる状態にあってもよい。次いで、バイナリからカーネルが検索された後に（ブロック６７０）、カーネルは、特定のターゲットプロセッサに伝達されてもよい（ブロック６８０）。カーネルは、ストリングとして、又は、バッファに入れることを含む種々の方法で、特定のターゲットプロセッサに伝達されてもよい。次いで、カーネルは、特定のターゲットプロセッサによって実行されてもよい（ブロック６９０）。ブロック６９０の後に、ソフトウェアアプリケーションは、カーネルに関する別の要求が生成されるまで、ＣＰＵ上で実行され続けてもよい（条件ブロック６６０）。ステップ６１０〜６４０は、コンピューティングシステムによって用いられる複数のライブラリに関して複数回繰り返されてもよい。カーネルが、ＧＰＵなどの高度に並列化されたプロセッサ上で通常実行されている間に、カーネルは、ＣＰＵ上、又は、ＧＰＵ、ＣＰＵ及び他のデバイスの組合せ上で分散された状態で実行されてもよいことに留意されたい。
【００４４】
上記の実施形態はソフトウェアを含んでもよいことに留意されたい。このような実施形態では、説明される方法及び機構を表すプログラム命令及び／又はデータベースは、一時的でない（ｎｏｎ−ｔｒａｎｓｉｔｏｒｙ）コンピュータ可読記憶媒体上に格納されてもよい。プログラム命令は、任意の不揮発性メモリデバイスと共に、又は、不揮発性メモリデバイスによって用いられる機械、プロセッサ及び／又は任意の汎用コンピュータによる実行のための機械可読命令を含んでもよい。適切なプロセッサは、単なる例として、汎用プロセッサと特殊用途プロセッサとの両方を含む。
【００４５】
一般的に言えば、一時的でないコンピュータ可読記憶媒体は、命令及び／又はデータをコンピュータに提供するために、使用中にコンピュータによってアクセス可能な任意の記憶媒体を含んでもよい。例えば、一時的でないコンピュータ可読記憶媒体は、磁気媒体又は光学媒体、例えば、ディスク（固定若しくはリムーバブル）、テープ、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、ＣＤ−Ｒ、ＣＤ−ＲＷ、ＤＶＤ−Ｒ、ＤＶＤ−ＲＷ若しくはブルーレイなどの記憶媒体を含んでもよい。記憶媒体は、ＲＡＭ（例えば、シンクロナスダイナミックＲＡＭ（ＳＤＲＡＭ）、ダブルデータ転送速度（ＤＤＲ、ＤＤＲ２、ＤＤＲ３など）ＳＤＲＡＭ、低パワーＤＤＲ（ＬＰＤＤＲ２など）ＳＤＲＡＭ、Ｒａｍｂｕｓ  ＤＲＡＭ（ＲＤＲＡＭ）、スタティックＲＡＭ（ＳＲＡＭ））、ＲＯＭ、ＵＳＢインターフェースなどの周辺機器インターフェースを介してアクセス可能な不揮発性メモリ（例えば、フラッシュメモリ）などの、揮発性記憶媒体又は不揮発性記憶媒体をさらに含んでもよい。記憶媒体は、微小電気機械システム（ＭＥＭＳ）、並びに、ネットワーク及び／又は無線リンクなどの通信媒体を介してアクセス可能な記憶媒体を含んでもよい。
【００４６】
他の実施形態では、説明される方法及び機構を表すプログラム命令は、Ｖｅｒｉｌｏｇ又はＶＨＤＬなどのハードウェア設計言語（ＨＤＬ）でのハードウェア機能性の動作レベルの記述、又は、レジスタ転送レベル（ＲＴＬ）の記述であってもよい。記述は、合成ライブラリからゲートのリストを含むネットリストを生成するために、記述を合成し得る合成ツールによって読み出されてもよい。ネットリストは、システムを構成するハードウェアの機能性も表す一組のゲートを含む。ネットリストは、次いで、マスクに適用されるべき幾何学的形状を記述するデータセットを生成するために、配置及びルーティングされてもよい。マスクは、次いで、システムに対応する１つ以上の半導体回路を生産するために、種々の半導体製造ステップで用いられてもよい。代替的に、コンピュータがアクセス可能な記憶媒体上のデータベースは、所望に応じてネットリスト（合成ライブラリを伴う、若しくは、伴わない）又はデータセットであってもよい。コンピュータがアクセス可能な記憶媒体は、システムの表現を搬送してもよいが、他の実施形態は、所望に応じて、ＩＣ、プログラムの任意の組（例えば、ＡＰＩ、ＤＬＬ、コンパイラ）又はプログラムの一部を含むシステムの任意の部分の表現を搬送してもよい。
【００４７】
本発明によって、又は、本発明と併せて用いられ得るタイプのハードウェアコンポーネント、プロセッサ又はマシンは、ＡＳＩＣ、ＦＰＧＡ、マイクロプロセッサ又は任意の集積回路を含む。こうしたプロセッサは、処理されたＨＤＬ命令（こうした命令はコンピュータ可読媒体上に格納することができる）の結果を用いて製造プロセスを構成することによって製造されてもよい。こうした処理の結果は、次いで、本明細書で説明される方法及び機構の態様を実装するプロセッサを製造するために半導体製造プロセスで用いられる、マスクワークであってもよい。
【００４８】
特徴及び要素が、例示的な実施形態において特定の組み合わせで説明されるが、各特徴又は要素は、例示的な実施形態の他の特徴及び要素を伴わずに単独で、又は、他の特徴及び要素を伴う若しくは伴わない種々の組み合わせで用いることができる。上記の実施形態は、実装の限定ではない単なる例であることも強調されるべきである。上記の開示が十分に認識されれば、当業者には多くの変形及び修正が明らかとなるであろう。以下の請求項は、全てのこうした変形及び修正を包含するように解釈されることが意図される。
【図１】
2015503161.tif 000003
【図２】
2015503161.tif 000004
【図３】
2015503161.tif 000005
【図４】
2015503161.tif 000006
【図５】
2015503161.tif 000007
【図６】
2015503161.tif 000008
【手続補正書】
【提出日】平成26年8月1日(2014.8.1)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
ホストプロセッサと、
前記ホストプロセッサに結合されたターゲットプロセッサと、を備えるシステムであって、
前記システムは、
予めコンパイルされたライブラリを受信するように構成されており、
前記予めコンパイルされたライブラリは、前記システムに受信される前に、１つ以上のカーネルを有するソースコードから第１の中間表現にコンパイルされており、
前記第１の中間表現は、前記第１の中間表現の前記１つ以上のカーネルであって、前記ターゲットプロセッサによって実行されない１つ以上のカーネルを有しており、
前記ホストプロセッサは、
前記予めコンパイルされたライブラリを、前記第１の中間表現からバイナリにコンパイルし、
前記バイナリをメモリに格納する、ように構成されており、
前記バイナリは、前記１つ以上のカーネルのうち、前記ターゲットプロセッサによって実行可能な少なくとも１つのカーネルを含み、
前記カーネルは、前記バイナリの所与のカーネルに関する要求の検出に応じて、前記ターゲットプロセッサによる実行のために提供される、
システム。
【請求項２】
前記ターゲットプロセッサによる実行のための前記カーネルの提供は、前記ターゲットプロセッサが前記カーネルを格納場所から検索すること、又は、前記ホストプロセッサが前記カーネルを前記ターゲットプロセッサに伝達することを含む、請求項１に記載のシステム。
【請求項３】
前記ホストプロセッサは、オープンコンピューティング言語（ＯｐｅｎＣＬ）ランタイム環境を動作させ、
前記バイナリを開くことは、前記バイナリに対応するマスターインデックステーブルを、前記ホストプロセッサのメモリにロードすることを含み、
前記バイナリから前記所与のカーネルを検索することは、前記バイナリ内の前記所与のカーネルの場所を判定するために、前記マスターインデックステーブルにおいて前記所与のカーネルを参照することを含む、請求項１に記載のシステム。
【請求項４】
前記ホストプロセッサは中央処理装置（ＣＰＵ）であり、前記ターゲットプロセッサはグラフィックス処理ユニット（ＧＰＵ）であり、前記ＧＰＵは複数の処理要素を含む、請求項１に記載のシステム。
【請求項５】
前記ソースコードは、前記システムによって受信されない、請求項１に記載のシステム。
【請求項６】
前記予めコンパイルされたライブラリを、第１の中間表現からバイナリにコンパイルすることは、前記第１の中間表現を第２の中間表現にコンパイルすることと、前記第２の中間表現を前記バイナリにコンパイルすることとを含む、請求項１に記載のシステム。
【請求項７】
前記予めコンパイルされたライブラリの前記第１の中間表現は暗号化されており、
前記ホストプロセッサは、前記第１の中間表現をバイナリにコンパイルする前に、前記第１の中間表現を復号化するように構成されている、請求項１に記載のシステム。
【請求項８】
前記予めコンパイルされたライブラリは、インストレーションパッケージに含まれており、又は、前記システムによってダウンロードされる、請求項１に記載のシステム。
【請求項９】
コンピューティングシステムで、ライブラリの中間表現（ＩＲ）を受信することと、
前記ライブラリの前記ＩＲを、特定のターゲットプロセッサをターゲットとするバイナリであって、前記１つ以上のカーネルのうち、前記特定のターゲットプロセッサによって実行可能な少なくとも１つのカーネルを有するバイナリにコンパイルすることと、
カーネルに関する要求の検出に応じて、前記バイナリから前記カーネルを検索することと、
前記特定のターゲットプロセッサ上で前記カーネルを実行することと、
を含み、
前記ライブラリの前記ＩＲは、前記コンピューティングシステムによって受信される前に、１つ以上のカーネルを有するソースコードからコンパイルされており、
前記ＩＲは、前記中間表現において前記１つ以上のカーネルを含み、
前記ＩＲは、前記特定のターゲットプロセッサによって実行されない、
方法。
【請求項１０】
前記バイナリからカーネルを検索することは、
前記バイナリに対応するマスターインデックステーブルを前記ＣＰＵのメモリにロードすることと、
前記マスターインデックステーブルから前記カーネルに関する場所情報を検索することと、
を含む、請求項９に記載の方法。
【請求項１１】
前記特定のターゲットプロセッサは、グラフィックス処理ユニット（ＧＰＵ）である、請求項９に記載の方法。
【請求項１２】
前記ライブラリの前記ＩＲは、インストレーションパッケージに含まれており、又は、前記コンピューティングシステムによってダウンロードされる、請求項９に記載の方法。
【請求項１３】
前記ソースコードは、前記コンピューティングシステムによって受信されない、請求項９に記載の方法。
【請求項１４】
前記ＩＲは、低レベル仮想機械（ＬＬＶＭ）ＩＲを含み、
前記方法は、前記ＬＬＶＭ  ＩＲを中間言語（ＩＬ）表現にコンパイルすることと、前記ＩＬ表現を前記バイナリにコンパイルすることとを含む、請求項９に記載の方法。
【請求項１５】
前記ＩＲは、前記カーネルに関する要求を検出する前に、バイナリにコンパイルされる、請求項９に記載の方法。
【請求項１６】
前記ＩＲは、前記ターゲットプロセッサによって実行可能ではない、請求項９に記載の方法。
【請求項１７】
プログラム命令を備えるコンピュータ可読記憶媒体であって、
前記プログラム命令は、実行されると、
予めコンパイルされたライブラリを受信し、
前記予めコンパイルされたライブラリを、前記第１の中間表現からバイナリにコンパイルし、
前記バイナリをメモリに格納し、
前記バイナリの所与のカーネルに関する要求の検出に応じて、前記バイナリを開き、前記バイナリから前記所与のカーネルを検索し、前記所与のカーネルを実行のために前記ターゲットプロセッサに提供する、
ように動作可能であり、
前記予めコンパイルされたライブラリは、コンピューティングシステムに受信される前に、１つ以上のカーネルを有するソースコードから第１の中間表現にコンパイルされており、
前記第１の中間表現は、前記第１の中間表現において前記１つ以上のカーネルを含み、
前記バイナリは、前記１つ以上のカーネルのうち、前記コンピューティングシステムのターゲットプロセッサによって直接実行可能な少なくとも１つのカーネルを含み、
前記第１の中間表現は、前記ターゲットプロセッサによって実行されない、
コンピュータ可読記憶媒体。
【請求項１８】
前記バイナリを開くことは、前記バイナリに対応するマスターインデックステーブルを、前記ホストプロセッサのメモリにロードすることを含み、
前記バイナリから前記所与のカーネルを検索することは、前記バイナリ内の前記所与のカーネルの場所を判定するために、前記マスターインデックステーブルにおいて前記所与のカーネルを参照することを含む、請求項１７に記載のコンピュータ可読記憶媒体。
【請求項１９】
前記ソースコードは、前記コンピューティングシステムによって受信されない、請求項１７に記載のコンピュータ可読記憶媒体。
【請求項２０】
前記第１の中間表現は、前記バイナリの所与のカーネルに関する要求を検出する前に、バイナリにコンパイルされる、請求項１７に記載のコンピュータ可読記憶媒体。
【請求項２１】
前記予めコンパイルされたライブラリを、第１の中間表現からバイナリにコンパイルすることは、前記第１の中間表現を第２の中間表現にコンパイルすることと、前記第２の中間表現を前記バイナリにコンパイルすることとを含む、請求項１７に記載のコンピュータ可読記憶媒体。
【請求項２２】
前記予めコンパイルされたライブラリは、インストレーションパッケージに含まれており、又は、前記コンピューティングシステムによってダウンロードされる、請求項１７に記載のコンピュータ可読記憶媒体。
【国際調査報告】
2015503161.tif 000009