(57)【要約】  本開示は、マルチプルプロセッサ計算プラットフォーム内で用いることができる通信技法について説明する。それらの技法は、幾つかの例では、コマンド待ち行列を用いてタスクを開始させるマルチプルプロセッサ計算プラットフォーム内でのメッセージ渡しをサポートするために用いることができるソフトウェアインタフェースを提供することができる。それらの技法は、追加の例では、マルチプルプロセッサ計算プラットフォーム内における共有メモリプロセッサ間通信のために用いることができるソフトウェアインタフェースを提供することができる。さらなる例では、それらの技法は、グラフィックス処理装置（ＧＰＵ）とホストＣＰＵとの間でのメッセージ渡し及び／又は共有メモリ通信をサポートするためのハードウェアを含むＧＰＵを提供することができる。
2013537993.tif 000002
【特許請求の範囲】
【請求項１】
ホストデバイスであって、
１つ以上のプロセッサと、
前記１つ以上のプロセッサで実行し、前記ホストデバイスで実行中のプロセスから１つ以上の待ち行列内追加命令を受信したことに応答してコマンド待ち行列内に複数のコマンドを入れるように構成されたコマンド待ち行列インタフェースであって、前記複数のコマンドは、前記ホストデバイスと関連付けられた第１のメモリスペースとグラフィックス処理装置（ＧＰＵ）と関連付けられた第２のメモリスペースとの間でデータを転送するように前記ホストデバイスに命令する第１のコマンドを含み、前記複数のコマンドは、前記ＧＰＵでのタスクの実行を開始するように前記ホストデバイスに命令する第２のコマンドをさらに含む、コマンド待ち行列インタフェースと、
前記１つ以上のプロセッサで実行し、前記ＧＰＵでタスクが実行している間に及び前記ホストデバイスで実行中の前記プロセスから１つ以上のメッセージ渡し命令を受信したことに応答して前記ホストデバイスで実行中の前記プロセスと前記ＧＰＵで実行中の前記タスクとの間で１つ以上のメッセージを渡すように構成されたメッセージ渡しインタフェースと、を備える、ホストデバイス。
【請求項２】
前記１つ以上のメッセージ渡し命令は、前記ホストデバイスで実行中の前記プロセスから前記ＧＰＵで実行中の前記タスクにメッセージを送信するように前記メッセージ渡しインタフェースに命令する送信命令を備え、
前記メッセージ渡しインタフェースは、前記送信命令を受信したことに応答して、前記ＧＰＵで前記タスクが実行している間に前記ホストデバイスで実行中の前記プロセスから前記ＧＰＵで実行中の前記タスクに前記メッセージを送信するようにさらに構成される請求項１に記載のデバイス。
【請求項３】
前記１つ以上のメッセージ渡し命令は、前記ＧＰＵで実行中の前記タスクがメッセージを送信していることを示す信号を前記ＧＰＵから受信したことに応答してコールバックルーチンを呼び出すように前記メッセージ渡しインタフェースに命令するレジスタコールバックルーチン命令を備え、
前記メッセージ渡しインタフェースは、前記ＧＰＵで実行中の前記タスクがメッセージを送信していることを示す前記信号を前記ＧＰＵから受信したことに応答して前記レジスタコールバックルーチン命令内で指定された前記コールバックルーチンの実行を開始するようにさらに構成される請求項１に記載のデバイス。
【請求項４】
前記１つ以上のメッセージ渡し命令は、前記ＧＰＵで実行中のタスクがメッセージを送信しているかどうかを示すメッセージ状態情報に関して前記ＧＰＵをポーリングするように前記メッセージ渡しインタフェースに命令するポーリング命令を備え、
前記メッセージ渡しインタフェースは、前記ポーリング命令を受信したことに応答して前記メッセージ状態情報に関して前記ＧＰＵをポーリングするようにさらに構成され、前記ＧＰＵで実行中の前記タスクがメッセージを送信していることを前記メッセージ状態情報が示す場合は、前記ＧＰＵから前記メッセージを入手するようにさらに構成される請求項１に記載のデバイス。
【請求項５】
前記ＧＰＵで実行中の前記タスクは、前記ＧＰＵで実行中の前記タスクから前記ホストデバイスで実行中の前記プロセスにメッセージを送信するように前記ＧＰＵに命令する命令を含む請求項１に記載のデバイス。
【請求項６】
前記ＧＰＵで実行中の前記タスクは、入手可能な場合に前記ホストデバイスで実行中の前記プロセスから前記タスクに送信されたメッセージを前記タスクに提供するように前記ＧＰＵに命令する命令を含む請求項１に記載のデバイス。
【請求項７】
前記メッセージ渡しインタフェースは、前記コマンド待ち行列内にコマンドを入れずに前記１つ以上のメッセージ渡し命令を実行するようにさらに構成される請求項１に記載のデバイス。
【請求項８】
ホストデバイスの１つ以上のプロセッサで実行するコマンド待ち行列インタフェースを用いて、前記ホストデバイスで実行中のプロセスから１つ以上の待ち行列内追加命令を受信したことに応答してコマンド待ち行列内に複数のコマンドを入れることであって、前記複数のコマンドは、前記ホストデバイスと関連付けられた第１のメモリスペースとグラフィックス処理装置（ＧＰＵ）と関連付けられた第２のメモリスペースとの間でデータを転送するように前記ホストデバイスに命令する第１のコマンドを含み、前記複数のコマンドは、前記ＧＰＵでのタスクの実行を開始するように前記ホストデバイスに命令する第２のコマンドをさらに含むことと、
前記ホストデバイスの前記１つ以上のプロセッサで実行するメッセージ渡しインタフェースを用いて、前記ＧＰＵでタスクが実行している間に及び前記ホストデバイスで実行中の前記プロセスから１つ以上のメッセージ渡し命令を受信したことに応答して前記ホストデバイスで実行中の前記プロセスと前記ＧＰＵで実行中の前記タスクとの間で１つ以上のメッセージを渡すことと、を備える、方法。
【請求項９】
前記１つ以上のメッセージ渡し命令は、前記ホストデバイスで実行中の前記プロセスから前記ＧＰＵで実行中の前記タスクにメッセージを送信するように前記メッセージ渡しインタフェースに命令する送信命令を備え、
前記方法は、前記メッセージ渡しインタフェースを用いて、前記ＧＰＵで前記タスクが実行している間に及び前記送信命令を受信したことに応答して前記ホストデバイスで実行中の前記プロセスから前記ＧＰＵで実行中の前記タスクに前記メッセージを送信することをさらに備える請求項８に記載の方法。
【請求項１０】
前記１つ以上のメッセージ渡し命令は、前記ＧＰＵで実行中の前記タスクがメッセージを送信していることを示す信号を前記ＧＰＵから受信したことに応答してコールバックルーチンを呼び出すように前記メッセージ渡しインタフェースに命令するレジスタコールバックルーチン命令を備え、
前記方法は、前記ＧＰＵで実行中の前記タスクがメッセージを送信していることを示す前記信号を前記ＧＰＵから受信したことに応答して前記レジスタコールバックルーチン命令内で指定された前記コールバックルーチンの実行を開始することをさらに構成される、請求項８に記載の方法。
【請求項１１】
前記１つ以上のメッセージ渡し命令は、前記ＧＰＵで実行中の前記タスクがメッセージを送信しているかどうかを示すメッセージ状態情報に関して前記ＧＰＵをポーリングするように前記メッセージ渡しインタフェースに命令するポーリング命令を備え、
前記方法は、
前記メッセージ渡しインタフェースを用いて、前記ポーリング命令を受信したことに応答して前記メッセージ状態情報に関して前記ＧＰＵをポーリングすることと、
前記ＧＰＵで実行中の前記タスクがメッセージを送信していることを前記メッセージ状態情報が示す場合は、前記ＧＰＵから前記メッセージを入手することと、をさらに備える請求項８に記載の方法。
【請求項１２】
前記ＧＰＵで実行中の前記タスクは、前記ＧＰＵで実行中の前記タスクから前記ホストデバイスで実行中の前記プロセスにメッセージを送信するように前記ＧＰＵに命令する命令を含む請求項８に記載の方法。
【請求項１３】
前記ＧＰＵで実行中の前記タスクは、入手可能な場合に前記ホストデバイスで実行中の前記プロセスから前記タスクに送信されたメッセージを前記タスクに提供するように前記ＧＰＵに命令する命令を含む請求項８に記載の方法。
【請求項１４】
前記メッセージ渡しインタフェースを用いて、前記コマンド待ち行列内にコマンドを入れずに前記１つ以上のメッセージ渡し命令を実行することをさらに備える請求項８に記載の方法。
【請求項１５】
ホストデバイスで実行中のプロセスから１つ以上の待ち行列内追加命令を受信したことに応答してコマンド待ち行列内に複数のコマンドを入れるための手段であって、前記複数のコマンドは、前記ホストデバイスと関連付けられた第１のメモリスペースとグラフィックス処理装置（ＧＰＵ）と関連付けられた第２のメモリスペースとの間でデータを転送するように前記ホストデバイスに命令する第１のコマンドを含み、前記複数のコマンドは、前記ＧＰＵでのタスクの実行を開始するように前記ホストデバイスに命令する第２のコマンドをさらに含む手段と、
前記ＧＰＵでタスクが実行している間に及び前記ホストデバイスで実行中の前記プロセスから１つ以上のメッセージ渡し命令を受信したことに応答して前記ホストデバイスで実行中の前記プロセスと前記ＧＰＵで実行中の前記タスクとの間で１つ以上のメッセージを渡すための手段と、を備える、装置。
【請求項１６】
前記１つ以上のメッセージ渡し命令は、前記ホストデバイスで実行中の前記プロセスから前記ＧＰＵで実行中の前記タスクにメッセージを送信するように前記１つ以上のメッセージを渡すための前記手段に命令する送信命令を備え、
前記装置は、前記送信命令を受信したことに応答して、前記ＧＰＵで前記タスクが実行している間に前記ホストデバイスで実行中の前記プロセスから前記ＧＰＵで実行中の前記タスクに前記メッセージを送信するための手段をさらに備える請求項１５に記載の装置。
【請求項１７】
前記１つ以上のメッセージ渡し命令は、前記ＧＰＵで実行中の前記タスクがメッセージを送信していることを示す信号を前記ＧＰＵから受信したことに応答してコールバックルーチンを呼び出すように前記１つ以上のメッセージを渡すための前記手段に命令するレジスタコールバックルーチン命令を備え、
前記装置は、前記ＧＰＵで実行中の前記タスクがメッセージを送信していることを示す前記信号を前記ＧＰＵから受信したことに応答して前記レジスタコールバックルーチン命令内で指定された前記コールバックルーチンの実行を開始するための手段をさらに備える請求項１５に記載の装置。
【請求項１８】
前記１つ以上のメッセージ渡し命令は、前記ＧＰＵで実行中の前記タスクがメッセージを送信しているかどうかを示すメッセージ状態情報に関して前記ＧＰＵをポーリングするように前記１つ以上のメッセージを渡すための前記手段に命令するポーリング命令を備え、
前記装置は、
前記ポーリング命令を受信したことに応答して前記メッセージ状態情報に関して前記ＧＰＵをポーリングするための手段と、
前記ＧＰＵで実行中の前記タスクがメッセージを送信していることを前記メッセージ状態情報が示す場合は、前記ＧＰＵから前記メッセージを入手するための手段と、をさらに備える請求項１５に記載の装置。
【請求項１９】
ホストデバイスで実行中のプロセスから１つ以上の待ち行列内追加命令を受信したことに応答してコマンド待ち行列内に複数のコマンドを入れること、及び
前記ＧＰＵでタスクが実行している間に及び前記ホストデバイスで実行中の前記プロセスから１つ以上のメッセージ渡し命令を受信したことに応答して前記ホストデバイスで実行中の前記プロセスと前記ＧＰＵで実行中の前記タスクとの間で１つ以上のメッセージを渡すことを１つ以上のプロセッサに行わせる命令を備えるコンピュータによって読み取り可能な媒体であって、前記複数のコマンドは、前記ホストデバイスと関連付けられた第１のメモリスペースとグラフィックス処理装置（ＧＰＵ）と関連付けられた第２のメモリスペースとの間でデータを転送するように前記ホストデバイスに命令する第１のコマンドを含み、前記複数のコマンドは、前記ＧＰＵでのタスクの実行を開始するように前記ホストデバイスに命令する第２のコマンドをさらに含む、コンピュータによって読み取り可能な媒体。
【請求項２０】
前記１つ以上のメッセージ渡し命令は、前記ホストデバイスで実行中の前記プロセスから前記ＧＰＵで実行中の前記タスクにメッセージを送信するように前記１つ以上のプロセッサに命令する送信命令を備え、
前記コンピュータによって読み取り可能な媒体は、前記送信命令を受信したことに応答して、前記ＧＰＵで前記タスクが実行している間に前記ホストデバイスで実行中の前記プロセスから前記ＧＰＵで実行中の前記タスクに前記メッセージを送信することを前記１つ以上のプロセッサに行わせる命令をさらに備える請求項１９に記載のコンピュータによって読み取り可能な媒体。
【請求項２１】
前記１つ以上のメッセージ渡し命令は、前記ＧＰＵで実行中の前記タスクがメッセージを送信していることを示す信号を前記ＧＰＵから受信したことに応答してコールバックルーチンを呼び出すように前記１つ以上のプロセッサに命令するレジスタコールバックルーチン命令を備え、
前記コンピュータによって読み取り可能な媒体は、前記ＧＰＵで実行中の前記タスクがメッセージを送信していることを示す前記信号を前記ＧＰＵから受信したことに応答して前記レジスタコールバックルーチン命令内で指定された前記コールバックルーチンの実行を開始することを前記１つ以上のプロセッサに行わせる命令をさらに備える請求項１９に記載のコンピュータによって読み取り可能な媒体。
【請求項２２】
前記１つ以上のメッセージ渡し命令は、前記ＧＰＵで実行中の前記タスクがメッセージを送信しているかどうかを示すメッセージ状態情報に関して前記ＧＰＵをポーリングするように前記１つ以上のプロセッサに命令するポーリング命令を備え、
前記コンピュータによって読み取り可能な媒体は、
前記ポーリング命令を受信したことに応答して前記メッセージ状態情報に関して前記ＧＰＵをポーリングすること、及び
前記ＧＰＵで実行中の前記タスクがメッセージを送信していることを前記メッセージ状態情報が示す場合は、前記ＧＰＵから前記メッセージを入手することを前記１つ以上のプロセッサに行わせる命令をさらに備える請求項１９に記載のコンピュータによって読み取り可能な媒体。
【請求項２３】
タスクを実行するように構成された１つ以上のプロセッサと、
ホストデバイスによってアクセス可能な１つ以上のレジスタと、
前記１つ以上のプロセッサで前記タスクが実行している間に及び前記１つ以上のプロセッサで実行中の前記タスクから１つ以上のメッセージ渡し命令を受信したことに応答して、前記１つ以上のプロセッサで実行中の前記タスクと前記ホストデバイスで実行中のプロセスとの間で、前記１つ以上のレジスタを介して、１つ以上のメッセージを渡すように構成されたメッセージ渡しモジュールと、を備える、グラフィックス処理装置（ＧＰＵ）。
【請求項２４】
前記１つ以上のメッセージ渡し命令は、前記ＧＰＵで実行中の前記タスクから前記ホストデバイスで実行中の前記プロセスにメッセージを送信するように前記メッセージ渡しモジュールに命令する送信命令を備え、
前記メッセージ渡しモジュールは、前記１つ以上のレジスタに前記メッセージと関連付けられたメッセージデータを格納するようにさらに構成される請求項２３に記載のＧＰＵ。
【請求項２５】
前記１つ以上のメッセージ渡し命令は、入手可能な場合に前記ホストデバイスで実行中の前記プロセスから前記タスクに送信されたメッセージを前記タスクに提供するように前記メッセージ渡しモジュールに命令する受信命令を備え、
前記メッセージ渡しモジュールは、前記１つ以上のレジスタから前記メッセージと関連付けられたメッセージデータを入手するようにさらに構成される請求項２３に記載のＧＰＵ。
【請求項２６】
グラフィックス処理装置（ＧＰＵ）のメッセージ渡しモジュールを用いて、前記ＧＰＵで実行中のタスクから１つ以上のメッセージ渡し命令を受信することと、
前記ＧＰＵで前記タスクが実行している間に及び前記ＧＰＵで実行中の前記タスクから前記１つ以上のメッセージ渡し命令を受信したことに応答して前記ＧＰＵで実行中の前記タスクと前記ホストデバイスで実行中のプロセスとの間で、ホストデバイスによってアクセス可能な前記ＧＰＵ内の１つ以上のレジスタを介して、１つ以上のメッセージを渡すことと、を備える、方法。
【請求項２７】
前記１つ以上のメッセージ渡し命令は、前記ＧＰＵで実行中の前記タスクから前記ホストデバイスで実行中の前記プロセスにメッセージを送信するように前記メッセージ渡しモジュールに命令する送信命令を備え、
前記方法は、前記１つ以上のレジスタに前記メッセージと関連付けられたメッセージデータを格納することをさらに備える請求項２６に記載の方法。
【請求項２８】
前記１つ以上のメッセージ渡し命令は、入手可能な場合に前記ホストデバイスで実行中の前記プロセスから前記タスクに送信されたメッセージを前記タスクに提供するように前記メッセージ渡しモジュールに命令する受信命令を備え、
前記方法は、前記１つ以上のレジスタから前記メッセージと関連付けられたメッセージデータを入手することをさらに備える請求項２６に記載の方法。
【請求項２９】
グラフィックス処理装置（ＧＰＵ）で実行中のタスクから１つ以上のメッセージ渡し命令を受信するための手段と、
前記ＧＰＵで前記タスクが実行している間に及び前記ＧＰＵで実行中の前記タスクから前記１つ以上のメッセージ渡し命令を受信したことに応答して前記ＧＰＵで実行中の前記タスクと前記ホストデバイスで実行中のプロセスとの間で、ホストデバイスによってアクセス可能な前記ＧＰＵ内の１つ以上のレジスタを介して、１つ以上のメッセージを渡すための手段と、を備える、装置。
【請求項３０】
前記１つ以上のメッセージ渡し命令は、前記ＧＰＵで実行中の前記タスクから前記ホストデバイスで実行中の前記プロセスにメッセージを送信するように渡すための前記手段に命令する送信命令を備え、
前記装置は、前記１つ以上のレジスタに前記メッセージと関連付けられたメッセージデータを格納するための手段をさらに備える請求項２９に記載の装置。
【請求項３１】
前記１つ以上のメッセージ渡し命令は、入手可能な場合に前記ホストデバイスで実行中の前記プロセスから前記タスクに送信されたメッセージを前記タスクに提供するように渡すための前記手段に命令する受信命令を備え、
前記装置は、前記１つ以上のレジスタから前記メッセージと関連付けられたメッセージデータを入手するための手段をさらに備える請求項２９に記載の装置。
【請求項３２】
グラフィックス処理装置（ＧＰＵ）で実行中のタスクから１つ以上のメッセージ渡し命令を受信し、及び
前記ＧＰＵで前記タスクが実行している間に及び前記ＧＰＵで実行中の前記タスクから前記１つ以上のメッセージ渡し命令を受信したことに応答して前記ＧＰＵで実行中の前記タスクと前記ホストデバイスで実行中のプロセスとの間で、ホストデバイスによってアクセス可能な前記ＧＰＵ内の１つ以上のレジスタを介して、１つ以上のメッセージを渡すことを１つ以上のプロセッサに行わせる命令を備える、コンピュータによって読み取り可能な媒体。
【請求項３３】
前記１つ以上のメッセージ渡し命令は、前記ＧＰＵで実行中の前記タスクから前記ホストデバイスで実行中の前記プロセスにメッセージを送信するように前記１つ以上のプロセッサに命令する送信命令を備え、
前記コンピュータによって読み取り可能な媒体は、前記１つ以上のレジスタに前記メッセージと関連付けられたメッセージデータを格納することを前記１つ以上のプロセッサに行わせる命令をさらに備える請求項３２に記載のコンピュータによって読み取り可能な媒体。
【請求項３４】
前記１つ以上のメッセージ渡し命令は、入手可能な場合に前記ホストデバイスで実行中の前記プロセスから前記タスクに送信されたメッセージを前記タスクに提供するように１つ以上のプロセッサに命令する受信命令を備え、
前記コンピュータによって読み取り可能な媒体は、前記１つ以上のレジスタから前記メッセージと関連付けられたメッセージデータを入手することを前記１つ以上のプロセッサに行わせる命令をさらに備える請求項３２に記載のコンピュータによって読み取り可能な媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、計算プラットフォームに関するものである。本開示は、より具体的には、複数のプロセッサを含む計算プラットフォームに関するものである。
【背景技術】
【０００２】
高い計算集約度及び／又は高いデータスループットが要求されるアプリケーションの性能を向上させるために複数のプロセッサを含む計算プラットフォームが用いられる。マルチプルプロセッサ計算プラットフォームは、ホストデバイスとして働くことができる汎用中央処理装置（ＣＰＵ）と、ホストＣＰＵが計算集約型タスクを実施する負担を軽減してそれによってシステム全体の性能を向上させるために使用することができる１つ以上の計算デバイスと、を含むことができる。幾つかの場合においては、１つ以上の計算デバイスは、幾つかのタイプのタスクをホストＣＰＵよりも効率的に処理してシステム全体のためのさらなる性能向上を提供することができるように特に設計することができる。例えば、１つ以上の計算デバイスは、並列アルゴリズムをホストＣＰＵよりも効率的に実行するように特に設計することができる。
【０００３】
マルチプルプロセッサ計算システムにおいて用いることができる１つのタイプの計算デバイスは、グラフィックス処理装置（ＧＰＵ）である。伝統的には、ＣＰＵは、表示デバイスへの三次元（３Ｄ）グラフィックスのリアルタイムレンダリング用に特に設計された固定された機能のハードウェアが含まれていたが、典型的にはプログラミングすることができない、すなわち、コンパイルされたプログラムをＧＰＵにダウンロードしてＧＰＵ上で実行することができなかった。しかしながら、より最近においては、プログラマブルシェーダユニット（ｓｈａｄｅｒ  ｕｎｉｔ）の開発に伴い、ＧＰＵのアーキテクチャの多くは、数多くの並列処理素子を含むプログラミング可能なアーキテクチャに移行している。プログラミング可能なアーキテクチャは、ＧＰＵがグラフィックス動作だけでなく汎用の計算タスクを高度に並列な形で実行することを容易にすることができる。
【０００４】
ＧＰＵを用いて汎用の非グラフィックス専用の計算タスクを実行することは、ここでは、グラフィックス処理装置上での汎用計算（ＧＰＧＰＵ）、又は代替としてＧＰＵ計算と呼ぶことができる。幾つかの事例においては、ＧＰＵは、グラフィック専用でないアプリケーションプログラミングインタフェース（ＡＰＩ）を利用可能にし、それによって汎用計算タスクの実行のためのＧＰＵのプログラミングを容易にすることができる。ＧＰＵ計算タスクは、計算集約型のタスク、及び／又は高度な並列性、例えば、行列計算、信号処理計算、統計アルゴリズム、分子モデル作成アプリケーション、金融アプリケーション、医療画像撮影、暗号解読アプリケーション、等を含むタスクを含むことができる。
【０００５】
ＧＰＵは、マルチプルプロセッサ計算プラットフォームにおいて用いることができる１つのタイプの計算デバイスであるにすぎず、ＧＰＵに加えて又はＧＰＵの代わりにその他のタイプの計算デバイスを使用することもできる。例えば、マルチプルプロセッサ計算プラットフォームにおいて用いることができるその他のタイプの計算デバイスは、例えば、追加のＣＰＵ、デジタル信号プロセッサ（ＤＳＰ）、セルブロードバンドエンジン（Ｃｅｌｌ／ＢＥ）プロセッサ又はその他のタイプの処理ユニットを含む。
【０００６】
複数の計算デバイスを有するマルチプルプロセッサ計算プラットフォームは、同種プラットフォーム又は異種プラットフォームであることができる。同種プラットフォームでは、すべての計算デバイスが共通の命令セットアーキテクチャ（ＩＳＡ）を共有する。対照的に、異種プラットフォームは、異なるＩＳＡを有する２つ以上の計算デバイスを含むことができる。概して、異なるタイプの計算デバイスは、異なるＩＳＡを有することができ、異なるブランドの同じタイプの計算デバイスも異なるＩＳＡを有することができる。
【０００７】
マルチプルプロセッサ計算プラットフォームの性能は、マルチコア計算デバイス及び／又は多コア計算デバイスを利用することによってさらに向上させることができる。マルチコア計算デバイスの一例は、複数の処理コアを有するプログラマブルシェーダユニットを内蔵する上記のＧＰＵである。しかしながら、ＣＰＵも、複数の処理コアを含むように設計することができる。概して、複数の処理コアを含むチップ又はダイは、マルチコアプロセッサとみなすことができる。処理コアは、１つの特定のデータに関する命令を実行することが可能な処理ユニットを意味することができる。例えば、ＧＰＵ内の単一の算術論理装置（ＡＬＵ）ユニット又はベクトルプロセッサは、処理コアとみなすことができる。多コアプロセッサは、概して、相対的に数多くのコア、例えば、１０個よりも多いコア、を有するマルチコアプロセッサを意味し、典型的には、それよりも少ない数のコアを有するマルチコアプロセッサを設計するために用いられる技法と異なるそれらを用いて設計される。マルチコアプロセッサは、ソフトウェアプログラムが単一チップ上の複数のコアにおいて並列で、例えば、同時並行して、実行するのを可能にすることによって性能向上を提供する。
【０００８】
並列プログラミングモデルは、プログラムを複数の処理コア上で同時並行して実行するのを可能にするように設計されるプログラミングモデルを意味する。プログラムは、マルチスレッドプログラムであることができ、その場合は、単一のスレッドが各処理コアにおいて動作することができる。幾つかの例では、単一の計算デバイスは、プログラムを実行するために用いられる全処理コアを含むことができる。その他の例では、プログラムを実行するために用いられる処理コアの一部を、同じタイプ又は異なるタイプの異なる計算デバイス上に配置することができる。
【０００９】
異なるＩＳＡを実装する異なる売り主によって製造される可能性がある異なるタイプの計算デバイスを含む異種のマルチコア計算プラットフォームの並列プログラミングのための共通言語仕様を提供するためにプラットフォーム横断、売り主横断型の、異種計算プラットフォーム、並列プログラミングモデルアプリケーションプログラミングインタフェース（ＡＰＩ）を用いることができる。Ｏｐｅｎ  Ｃｏｍｐｕｔｉｎｇ  Ｌａｎｇｕａｇｅ（ＯｐｅｎＣＬ（登録商標））は、プラットフォーム横断、売り主横断型の、異種計算プラットフォーム、並列プログラミングＡＰＩの一例である。該ＡＰＩは、ＧＰＵでのより一般化されたデータ処理を考慮して設計することができる。例えば、これらのＡＰＩは、共通言語を介して拡張シェーダサブシステム能力を明らかにすることに加えて、非グラフィックス専用の方法でＧＰＵ内へのデータフロー及び制御経路を一般化することができる。しかしながら、現在では、該ＡＰＩによって提供された命令セットは、ＧＰＵのハードウェアアーキテクチャに基づくものであり、従って、既存のＧＰＵアーキテクチャと互換可能な機能に制限される。
【発明の概要】
【００１０】
本開示は、マルチプルプロセッサ計算プラットフォーム内で使用することができる通信技法について説明する。それらの技法は、幾つかの例では、コマンド待ち行列を用いてタスクを開始させるマルチプルプロセッサ計算プラットフォーム内でのメッセージ渡し（ｍｅｓｓａｇｅ  ｐａｓｓｉｎｇ）をサポートするために用いることができるソフトウェアインタフェースを提供することができる。それらの技法は、追加の例では、マルチプルプロセッサ計算プラットフォーム内での共有メモリプロセッサ間通信のために用いることができるソフトウェアインタフェースを提供する。さらなる例では、それらの技法は、ＧＰＵとホストＣＰＵとの間でのメッセージ渡し及び／又は共有メモリ通信をサポートするためのハードウェアを含むグラフィックス処理装置（ＧＰＵ）を提供することができる。
【００１１】
一例では、本開示は、１つ以上のプロセッサを含むホストデバイスについて説明する。デバイスは、１つ以上のプロセッサにおいて実行し、ホストデバイス上で実行中のプロセスから１つ以上の待ち行列内追加命令（ｅｎｑｕｅｕｅ  ｉｎｓｔｒｕｃｔｉｏｎ）を受信したことに応答してコマンド待ち行列内に複数のコマンドを入れるように構成されたコマンド待ち行列インタフェース、をさらに含む。複数のコマンドは、ホストデバイスと関連付けられた第１のメモリスペースとグラフィックス処理装置（ＧＰＵ）と関連付けられた第２のメモリスペースとの間でデータを転送するようにホストデバイスに命令する第１のコマンドを含む。複数のコマンドは、ＧＰＵでのタスクの実行を開始するようにホストデバイスに命令する第２のコマンドをさらに含む。デバイスは、１つ以上のプロセッサ上で実行し、ＧＰＵ上でタスクが実行している間に及びホストデバイスで実行中のプロセスから１つ以上のメッセージ渡し命令を受信したことに応答してホストデバイスで実行中のプロセスとＧＰＵで実行中のタスクとの間で１つ以上のメッセージを渡すように構成されたメッセージ渡しインタフェース、をさらに含む。
【００１２】
他の例では、本開示は、ホストデバイスの１つ以上のプロセッサで実行するコマンド待ち行列インタフェースを用いて、ホストデバイスで実行中のプロセスから１つ以上の待ち行列内追加命令を受信したことに応答してコマンド待ち行列内に複数のコマンドを入れることを含む方法について説明する。複数のコマンドは、ホストデバイスと関連付けられた第１のメモリスペースとグラフィックス処理装置（ＧＰＵ）と関連付けられた第２のメモリスペースとの間でデータを転送するようにホストデバイスに命令する第１のコマンドを含む。複数のコマンドは、ＧＰＵでのタスクの実行を開始するようにホストデバイスに命令する第２のコマンドをさらに含む。方法は、ホストデバイスの１つ以上のプロセッサで実行するメッセージ渡しインタフェースを用いて、ＧＰＵでタスクが実行している間に及びホストデバイス上で実行中のプロセスから１つ以上のメッセージ渡し命令を受信したことに応答してホストデバイス上で実行中のプロセスとＧＰＵ上で実行中のタスクとの間で１つ以上のメッセージを渡すことをさらに含む。
【００１３】
他の例では、本開示は、ホストデバイスで実行中のプロセスから１つ以上の待ち行列内追加命令を受信したことに応答してコマンド待ち行列内に複数のコマンドを入れるための手段を含む装置について説明する。複数のコマンドは、ホストデバイスと関連付けられた第１のメモリスペースとグラフィックス処理装置（ＧＰＵ）と関連付けられた第２のメモリスペースとの間でデータを転送するようにホストデバイスに命令する第１のコマンドを含む。複数のコマンドは、ＧＰＵでのタスクの実行を開始するようにホストデバイスに命令する第２のコマンドをさらに含む。装置は、ＧＰＵ上でタスクが実行中に及びホストデバイスで実行中のプロセスから１つ以上のメッセージ渡し命令を受信したことに応答してホストデバイスで実行中のプロセスとＧＰＵで実行中のタスクとの間で１つ以上のメッセージを渡すための手段をさらに含む。
【００１４】
他の例では、本開示は、ホストデバイスで実行中のプロセスから１つ以上の待ち行列内追加命令を受信したことに応答してコマンド待ち行列内に複数のコマンドを入れることを１つ以上のプロセッサに行わせる命令を含むコンピュータによって読み取り可能な記憶媒体について説明する。複数のコマンドは、ホストデバイスと関連付けられた第１のメモリスペースとグラフィックス処理装置（ＧＰＵ）と関連付けられた第２のメモリスペースとの間でデータを転送するようにホストデバイスに命令する第１のコマンドを含む。複数のコマンドは、ＧＰＵでのタスクの実行を開始するようにホストデバイスに命令する第２のコマンドをさらに含む。コンピュータによって読み取り可能な記憶媒体は、ＧＰＵでタスクが実行している間に及びホストデバイスで実行中のプロセスから１つ以上のメッセージ渡し命令を受信したことに応答してホストデバイスで実行中のプロセスとＧＰＵで実行中のタスクとの間で１つ以上のメッセージを渡すことを１つ以上のプロセッサに行わせる命令をさらに含む。
【００１５】
他の例では、本開示は、タスクを実行するように構成された１つ以上のプロセッサを含むグラフィックス処理装置（ＧＰＵ）について説明する。ＧＰＵは、ホストデバイスによってアクセス可能な１つ以上のレジスタをさらに含む。ＧＰＵは、１つ以上のプロセッサでタスクが実行している間に及び１つ以上のプロセッサで実行中のタスクから１つ以上のメッセージ渡し命令を受信したことに応答して１つ以上のプロセッサで実行中のタスクとホストデバイスで実行中のプロセスとの間で、１つ以上のレジスタを介して、１つ以上のメッセージを渡すように構成されたメッセージ渡しモジュールをさらに含む。
【００１６】
他の例では、本開示は、グラフィックス処理装置（ＧＰＵ）のメッセージ渡しモジュールを用いて、ＧＰＵで実行中のタスクから１つ以上のメッセージ渡し命令を受信することを含む方法について説明する。方法は、ＧＰＵでタスクが実行している間に及びＧＰＵで実行中のタスクから１つ以上のメッセージ渡し命令を受信したことに応答してＧＰＵで実行中のタスクとホストデバイスで実行中のプロセスとの間で、ホストデバイスによってアクセス可能であるＧＰＵ内の１つ以上のレジスタを介して、１つ以上のメッセージを渡すことをさらに含む。
【００１７】
他の例では、本開示は、グラフィックス処理装置（ＧＰＵ）で実行中のタスクから１つ以上のメッセージ渡し命令を受信するための手段を含む装置について説明する。装置は、ＧＰＵでタスクが実行している間に及びＧＰＵで実行中のタスクから１つ以上のメッセージ渡し命令を受信したことに応答してＧＰＵで実行中のタスクとホストデバイスで実行中のプロセスとの間で、ホストデバイスによってアクセス可能であるＧＰＵ内の１つ以上のレジスタを介して、１つ以上のメッセージを渡すための手段をさらに含む。
【００１８】
他の例では、本開示は、グラフィックス処理装置（ＧＰＵ）で実行中のタスクから１つ以上のメッセージ渡し命令を受信することを１つ以上のプロセッサに行わせる命令を備えるコンピュータによって読み取り可能な媒体について説明する。コンピュータによって読み取り可能な記憶媒体は、ＧＰＵでタスクが実行している間に及びＧＰＵで実行中のタスクから１つ以上のメッセージ渡し命令を受信したことに応答してＧＰＵで実行中のタスクとホストデバイスで実行中のプロセスとの間で、ホストデバイスによってアクセス可能であるＧＰＵ内の１つ以上のレジスタを介して、１つ以上のメッセージを渡すことを１つ以上のプロセッサに行わせる命令をさらに含む。
【００１９】
他の例では、本開示は、ホストデバイスの１つ以上のプロセッサで実行するメモリバッファインタフェースを用いて、ホストデバイスによって及びグラフィックス処理装置（ＧＰＵ）によってアクセス可能である共有メモリスペースのために即時モード（ｉｍｍｅｄｉａｔｅ  ｍｏｄｅ）がイネーブルにされるべきであるかどうかを指定する情報を含む命令を受信することを含む方法について説明する。方法は、メモリバッファインタフェースを用いて、即時モードがイネーブルにされるべきであるかどうかを指定する情報に基づいて共有メモリスペースのために即時モードを選択的にイネーブルにすることをさらに含む。
【００２０】
他の例では、本開示は、１つ以上のプロセッサを含むホストデバイスについて説明する。デバイスは、１つ以上のプロセッサで実行し、共有メモリスペースのために即時モードがイネーブルにされるべきかどうかを指定する情報を含む命令を受信するように、及び即時モードがイネーブルにされるべきかどうかを指定する情報に基づいて共有メモリスペースのために即時モードを選択的にイネーブルにするように構成されたメモリバッファインタフェース、をさらに含み、共有メモリスペースは、ホストデバイスによって及びグラフィックス処理装置（ＧＰＵ）によってアクセス可能である。
【００２１】
他の例では、本開示は、ホストデバイスによって及びグラフィックス処理装置（ＧＰＵ）によってアクセス可能である共有メモリスペースのために即時モードがイネーブルにされるべきかどうかを指定する情報を含む命令を受信するための手段を含む装置について説明する。装置は、即時モードがイネーブルにされるべきかどうかを指定する情報に基づいて共有メモリスペースのために即時モードを選択的にイネーブルにするための手段をさらに含む。
【００２２】
他の例では、本開示は、ホストデバイスによって及びグラフィックス処理装置（ＧＰＵ）によってアクセス可能である共有メモリスペースのために即時モードがイネーブルにされるべきかどうかを指定する情報を含む命令を受信することを１つ以上のプロセッサに行わせる命令を備えるコンピュータによって読み取り可能な媒体について説明する。コンピュータによって読み取り可能な記憶媒体は、即時モードがイネーブルにされるべきかどうかを指定する情報に基づいて共有メモリスペースのために即時モードを選択的にイネーブルにすることを１つ以上のプロセッサに行わせる命令をさらに含む。
【００２３】
他の例では、本開示は、メモリと関連付けられたグラフィックス処理装置（ＧＰＵ）キャッシュを含むＧＰＵについて説明する。デバイスは、メモリのメモリスペースに関して読み取り動作及び書き込み動作のうちの少なくとも１つを実行するためにキャッシングサービスが使用されるべきかどうかを指定する情報を受信したことに応答してメモリスペースに関して読み取り動作及び書き込み動作のうちの少なくとも１つを実行するためにＧＰＵのキャッシュのキャッシングサービスを選択的に使用するように構成された１つ以上の処理モジュールをさらに含む。
【００２４】
他の例では、本開示は、メモリのメモリスペースに関して読み取り動作及び書き込み動作のうちの少なくとも１つを実行するためにキャッシングサービスが使用されるべきかどうかを指定する情報を受信したことに応答してメモリスペースに関して読み取り動作及び書き込み動作のうちの少なくとも１つを実行するためにメモリと関連付けられたグラフィックス処理装置（ＧＰＵ）キャッシュのキャッシングサービスを選択的に使用することを含む方法について説明する。
【００２５】
他の例では、本開示は、メモリと関連付けられたＧＰＵキャッシュを含む装置について説明する。装置は、メモリのメモリスペースに関して読み取り動作及び書き込み動作のうちの少なくとも１つを実行するためにキャッシングサービスが使用されるべきかどうかを指定する情報を受信したことに応答してメモリスペースに関して読み取り動作及び書き込み動作のうちの少なくとも１つを実行するためにＧＰＵキャッシュのキャッシングサービスを選択的に使用するための手段をさらに含む。
【００２６】
他の例では、本開示は、メモリのメモリスペースに関して読み取り動作及び書き込み動作のうちの少なくとも１つを実行するためにキャッシングサービスが使用されるべきかどうかを指定する情報を受信したことに応答してメモリスペースに関して読み取り動作及び書き込み動作のうちの少なくとも１つを実行するためにメモリと関連付けられたグラフィックス処理装置（ＧＰＵ）キャッシュのキャッシングサービスを選択的に使用することを１つ以上のプロセッサに行わせる命令を備えるコンピュータによって読み取り可能な媒体について説明する。
【図面の簡単な説明】
【００２７】
【図１】本開示によるメッセージ渡し技法を実行するために用いることができる計算システム例を示したブロック図である。
【図２】本開示による図１の計算システムにおいて用いることができるＧＰＵ例を示したブロック図である。
【図３】本開示によるマルチプルプロセッサプラットフォーム環境におけるメッセージ渡し技法例を示した流れ図である。
【図４】本開示によるホストデバイスで実行中のプロセスによって出された送信命令を実行するための技法例を示した流れ図である。
【図５】本開示による図４において例示された技法の一部分を実装するために用いることができる技法例を示した流れ図である。
【図６】本開示による図４において例示された技法の一部分を実装するために用いることができる技法例を示した流れ図である。
【図７】本開示による、計算デバイス、例えば、ＧＰＵ、で受信されたメッセージを処理するための技法例を示した流れ図である。
【図８】本開示による、計算デバイス、例えば、ＧＰＵ、で実行中のタスクによって出された受信命令を実行するための技法例を示した流れ図である。
【図９】本開示による図８において例示された技法の一部分を実装するために用いることができる技法例を示した流れ図である。
【図１０】本開示による図８において例示された技法の一部分を実装するために用いることができる技法例を示した流れ図である。
【図１１】本開示による計算デバイス、例えば、ＧＰＵ、で実行中のプロセスによって出された送信命令を実行するための技法例を示した流れ図である。
【図１２】本開示による図１１において例示された技法の一部分を実装するために用いることができる技法例を示した流れ図である。
【図１３】本開示による図１１において例示された技法の一部分を実装するために用いることができる技法例を示した流れ図である。
【図１４】本開示によるホストデバイスで実行中のプロセスによって出されたレジスタコールバックルーチン命令を実行するための技法例を示した流れ図である。
【図１５】本開示による計算デバイスから受信された割り込みを処理するための技法例を示した流れ図である。
【図１６】本開示による図１５において例示された技法の一部分を実装するために用いることができる技法例を示した流れ図である。
【図１７】本開示による図１５において例示された技法の一部分を実装するために用いることができる技法例を示した流れ図である。
【図１８】本開示によるホストデバイスで実行中のプロセスによって出された読み取り命令を実行するための技法例を示した流れ図である。
【図１９】本開示による図１８において例示された技法の一部分を実装するために用いることができる技法例を示した流れ図である。
【図２０】本開示による即時メモリオブジェクトの使用を容易にすることができる計算システム例を示したブロック図である。
【図２１】本開示によるホストデバイスで実行中のプロセスによって出されたメモリオブジェクト生成命令を実行するための技法例を示した流れ図である。
【図２２】本開示によるホストデバイスで実行中のプロセスによって出されたメモリオブジェクト生成命令を実行するための他の技法例を示した流れ図である。
【図２３】本開示によるキャッシュドモード及び即時モード命令を処理するための技法例を示した流れ図である。
【図２４】本開示によるキャッシュドモード及び即時モード命令を処理するための技法例を示した流れ図である。
【図２５】本開示によるキャッシュドモード及び即時モード命令を処理するための技法例を示した流れ図である。
【図２６】本開示によるキャッシュドモード及び即時モード命令を処理するための技法例を示した流れ図である。
【図２７】本開示による図２０の計算システムにおいて用いることができるＧＰＵ例を示したブロック図である。
【図２８】本開示によるキャッシュドモード及び即時モード命令を処理するための技法例を示した流れ図である。
【図２９】本開示によるホストデバイスで実行中のプロセスによって出されたメモリオブジェクト生成命令を実行するための他の技法例を示した流れ図である。
【図３０】本開示による第１のコンパイル技法によってコンパイルされた命令のシーケンスをＧＰＵがどのようにして処理することができるかを例示した流れ図である。
【図３１】本開示によるタスクのためのソースコードをコンパイルするための技法例を示した流れ図である。
【図３２】本開示によるキャッシングサービスを選択的に使用するためにＧＰＵによって用いることができる技法例を示した流れ図である。
【発明を実施するための形態】
【００２８】
本開示は、マルチプルプロセッサ計算プラットフォーム内で用いることができる通信技法について説明する。それらの技法は、幾つかの例では、コマンド待ち行列を用いてタスクを開始させるマルチプルプロセッサ計算プラットフォーム内でのメッセージ渡しをサポートするために用いることができるソフトウェアインタフェースを提供することができる。それらの技法は、追加の例では、マルチプルプロセッサ計算プラットフォーム内での共有メモリプロセッサ間通信のために用いることができるソフトウェアインタフェースを提供することができる。さらなる例では、それらの技法は、グラフィックス処理装置（ＧＰＵ）とホストＣＰＵとの間でのメッセージ渡し及び／又は共有メモリ通信をサポートするためのハードウェアを含むＧＰＵを提供することができる。
【００２９】
近年においては、リアルタイム３Ｄグラフィックスの処理のために元来は設計されたプロセッサ、例えば、グラフィックス処理装置（ＧＰＵ）、が、汎用計算タスク（ＧＰＧＰＵ）を実行するために一般化された。ＧＰＧＰＵの価値は、部分的ではあるが、産業全体にわたる規格、例えば、Ｏｐｅｎ  Ｃｏｍｐｕｔｉｎｇ  Ｌａｎｇｕａｇｅ（ＯｐｅｎＣＬ（登録商標））、の採用によって実証されている。ＯｐｅｎＣＬは、マルチプルプロセッサ計算プラットフォームにおいてタスクレベルでの並列性及びデータレベルでの並列性を有するプログラムを実行するために用いることができる、プラットフォーム横断、売り主横断型の異種計算プラットフォーム、並列プログラミングＡＰＩの一例である。ＡＰＩは、グラフィックス専用でない形でＧＰＵのデータフロー及び制御経路を一般化することによってＧＰＵ上でのより一般化されたデータ処理を可能にするように特に設計されている。このアプローチ法の１つの限界は、ホストＣＰＵと計算デバイス、例えば、ＧＰＵ、との間でのデータ通信の粗い粒度（ｇｒａｎｕｌａｒｉｔｙ）である。
【００３０】
例えば、ＯｐｅｎＣＬ  ＡＰＩは、ホストデバイスと１つ以上の計算デバイスとの間でのタスクレベルの粒度の通信をサポートするコマンド待ち行列インタフェースを提供する。各コマンド待ち行列は、特定の計算デバイスによって実行されることになるコマンドを概して保有する。ホストデバイスで実行中のホストプロセスは、メモリ転送を行うようにホストデバイスに命令するコマンドをコマンド待ち行列内に入れることによってホストメモリスペースとデバイスメモリスペースとの間でデータを転送することができる。同様に、ホストプロセスは、計算デバイスでタスクを実行するようにホストデバイスに命令するコマンドをコマンド待ち行列に入れることによって計算デバイスでの実行をタスクに開始させることができる。
【００３１】
コマンド待ち行列インタフェースは、コマンドのインオーダー（ｉｎ−ｏｒｄｅｒ）実行又はコマンドのアウトオブオーダー（ｏｕｔ−ｏｆ−ｏｒｄｅｒ）実行のいずれかを提供するように構成することができる。コマンド待ち行列インタフェースがコマンドのインオーダー実行を提供するように構成されるときには、コマンド待ち行列インタフェースは、コマンドがコマンド待ち行列内に入れられた順序で実行されること及び後続するコマンドの実行は先行コマンドが実行を完了するまで開始しないことを保証する。従って、ホストプロセスがタスクを実行するためのコマンドをコマンド待ち行列に入れたときには、コマンド待ち行列は、コマンド待ち行列に後続して入れられたあらゆる追加のコマンドを実行する前にそのタスクが実行を完了するのを待つ。
【００３２】
ホストＣＰＵとＧＰＵ及びインオーダーコマンドが関わる単純な設定では、ホストＣＰＵとＧＰＵとの間の通信方式は、次の動作、すなわち、（１）ホストＣＰＵがデータを準備してＧＰＵがアクセス可能なメモリ内にそれを入れる、（２）ホストＣＰＵが、タスクを実行するようにＧＰＵに指令する、（３）ホストＣＰＵが、ＧＰＵがタスクの実行を終了させるのを待つ、及び（４）ホストＣＰＵが、ＧＰＵによってアクセス可能なメモリからホストメモリにデータをコピーする、を含むことができる。該構成においては、ＧＰＵでのタスクの実行の開始前にタスクの実行のために必要な全データがＧＰＵによってアクセス可能なメモリに転送され、ＧＰＵで実行中のタスクによって生成されたデータは、ＧＰＵで実行中のタスクが実行を完了するまでホストＣＰＵは利用可能できない。ホストＣＰＵとＧＰＵとの間でのデータシェアリングのこの粗さ（ｃｏａｒｓｅｎｅｓｓ）は、並列に基づくアプリケーションのための数多くの有用な動作、例えば、ホストデバイスで実行中のプロセスとＧＰＵで実行中のタスクとの間でプロセス間メッセージを渡すこと、の有効な実装を妨げることがある。該メッセージは、例えば、ＧＰＵで実行中のタスクがホストＣＰＵでリモートプロシージャコール（Ｒｅｍｏｔｅ  Ｐｒｏｃｅｄｕｒｅ  Ｃａｌｌ（ＲＰＣ）（遠隔手順呼び出し）を実行する能力を有することを可能にする上で役立つことができる。
【００３３】
コマンド待ち行列インタフェースがコマンドのアウトオブオーダー実行を提供するように構成されるときには、ホストプロセスは、特定のタスクの実行中には、特定のコマンドの実行がいつ生じるか制御することができない。従って、コマンド待ち行列のためのアウトオブオーダー実行モードは、ホストデバイスで実行中のプロセスとＧＰＵで実行中のタスクとの間でのプロセス間メッセージ渡しの実装を有効な形で可能にしない。
【００３４】
ＯｐｅｎＣＬ内で用いられるメモリモデルに関して、ＡＰＩは、ホストＣＰＵとＧＰＵとの間でデータを共有するために又は複数のＯｐｅｎＣＬ計算デバイス間でデータを共有するために用いることができるいわゆるグローバルなＣＬバッファ及びグローバルなＣＬ画像を定義する。しかしながら、ＣＰＵ及びＧＰＵは、同時にバッファから読み取ること又はバッファに書き込むことができない。典型的には、ＣＰＵは、ソースデータが入った１つ以上のバッファを準備し、それらのバッファを処理のためにＧＰＵに渡す。ＧＰＵは、これらのバッファを変更するか又はＣＰＵデータ変更を受信することを目的としてＣＰＵで実行中のソフトウェアによって推測的にも割り当てられたその他のバッファ内に結果を入れる。
【００３５】
ＯｐｅｎＣＬ内のメモリオブジェクトは、現在は、ホストメモリスペースの領域を計算デバイスによって用いられるバッファデータの格納のために使用するのを可能にしているが、本明細書は、計算デバイスがタスクのより効率的な実行のためにこのデータをキャッシングするのを可能にする。ホストデバイスは、概して、バッファデータをキャッシングするために用いられる計算デバイスキャッシュを直ちに無効にすることができない。従って、ホストデバイスが、ホストメモリスペース内に格納される一定のメモリバッファデータをオーバーライトしようとしても、計算デバイスが変更されたデータに直ちにアクセスすることを可能にするために計算デバイス内のキャッシュが更新されることが保証されない。さらに、計算デバイスによって行われた計算の結果は、計算デバイスのキャッシュに格納することができるため、ホストデバイスで実行中のホストプロセスは、バッファからのデータは計算デバイスキャッシュに格納されているより新しいデータに起因して無効になっていることがあるためバッファからはどのような一部の結果も読み取ることができない。従って、ＯｐｅｎＣＬにおけるメモリ管理モデルは、共有されるメモリを介してのインフライト（ｉｎ−ｆｌｉｇｈｔ）データシェアリングを容易に可能にすることができない。
【００３６】
本開示において説明される技法は、幾つかの例では、ＯｐｅｎＣＬ  ＡＰＩの上記の限界のうちの１つ以上を克服するために使用することができる。例えば、本開示の技法は、タスクレベルの粒度のコマンド待ち行列を用いてタスクを開始させるマルチプルプロセッサ計算プラットフォーム内でのプロセス間メッセージ渡しをサポートするために用いることができるソフトウェアインタフェースを提供することができる。他の例として、本開示の技法は、マルチプルプロセッサ計算プラットフォーム内の共有メモリを介してのインフライトデータシェアリングをサポートするために使用することができるソフトウェアインタフェースを提供することができる。
【００３７】
幾つかの例では、本開示の技法は、ソフトウェアレベルでのメッセージ渡しを容易にするＧＰＵハードウェアアーキテクチャを提供することができる。例えば、本開示の技法は、ソフトウェアレベルメッセージ渡し命令の実行をサポートするように構成されるＧＰＵハードウェアアーキテクチャを提供することができる。さらなる例では、本開示の技法は、ＧＰＵとホストＣＰＵとの間の共有メモリ通信を容易にするＧＰＵハードウェアアーキテクチャを提供することができる。例えば、本開示の技法は、共有メモリスペースのためのキャッシングサービスを選択的にイネーブル及びディスエーブルにするように及び／又は共有メモリスペースのためにキャッシュコヒーレンシーメカニズムを選択的にイネーブル及びディスエーブルにするように構成されるＧＰＵハードウェアアーキテクチャを提供することができる。
【００３８】
本開示の第１の態様により、計算デバイスによるタスクの実行中におけるホストデバイスと１つ以上の計算デバイスとの間でのメッセージ渡し命令の実行を容易にするメッセージ渡しインタフェースが提供される。メッセージ渡しは、通信中のプロセスが各々メッセージを成功裏に渡すために補完的な組の動作を行う、プロセス間の、及び潜在的にデバイス間の、通信の１つの形態を意味することができる。例えば、メッセージ渡しプロトコルにより通信するプロセスの各々は、送信動作及び受信動作を実装することができる。本開示におけるメッセージ渡し技法は、ＣＰＵ及び計算デバイス、例えば、ＧＰＵ、が計算デバイスでのタスクの実行中に互いにメッセージを渡すことを可能にすることができる。この方法により、タスクレベルの粒度のコマンド待ち行列通信方式を実装するマルチプロセッサ計算プラットフォームは、プロセス間及び／又はデバイス間通信を容易にすることができる。
【００３９】
幾つかの例では、本開示において説明されるメッセージ渡し技法は、ホストデバイスと計算デバイス、例えば、ＧＰＵ、との間での通信のためにＯｐｅｎＣＬにおいて典型的に用いられるコマンド待ち行列インタフェース以外のインタフェースを用いることができるため、これらの技法は、“アウトオブバンドシグナリング”（ｏｕｔ−ｏｆ−ｂａｎｄ  ｓｉｇｎａｌｉｎｇ）技法と呼ぶことができる。換言すると、本開示の技法は、ＯｐｅｎＣＬ内に含められているインバンド（ｉｎ  ｂａｎｄ）コマンド待ち行列インタフェースと論理的に別個の新しいアウトオブバンド通信インタフェースを含むことができる。アウトオブバンド通信インタフェースは、コマンド待ち行列インタフェースの対象となるのと同じタスクレベルの粒度にならず、それにより、コマンド待ち行列のタスクレベルの粒度に関して上述される１つ以上の限界の解決策を提供することができる。
【００４０】
本開示の技法によりＣＰＵとＧＰＵとの間で転送されるメッセージは、あらゆるタイプのメッセージであることができる。異なるタイプのメッセージの例は、信号と、メモリ割り当て要求と、メモリ割り当て解除要求と、通知メッセージと、同期化メッセージと、遠隔手順呼び出しメッセージ（例えば、リモートプロシージャコール（ＲＰＣ）の一部であるメッセージ）と、データパケットと、報告メッセージと、アサーションメカニズムメッセージと、ロギングメッセージと、を含む。
【００４１】
現在のＯｐｅｎＣＬ規範では、ホストＣＰＵからＧＰＵへの全要求がＯｐｅｎＣＬコマンド待ち行列内に入れられ、次にＧＰＵに送信される。特に、アプリケーションは、非常に多数のカーネル実行及びバッファ動作をコマンド待ち行列に入れることができる。他方、最初に待ち行列に入れられたタスク、例えば、カーネル実行、が、例えば、ＣＰＵに追加のメモリ割り当てを要求する必要がある場合は、複数の課題が発生する。第１に、ＧＰＵは、メモリ割り当てが必要であることを実行中のカーネル内部からどのようにしてＣＰＵに通知するかということである。第２に、ＣＰＵは、メモリ割り当ての完了及び新たに割り当てられたメモリブロックのアドレスをどのようにしてＧＰＵに通知するかということである。しかしながら、本開示のメッセージ渡しインタフェース技法は、上記の通知及び情報が入った１つ以上のメッセージをＣＰＵとＧＰＵとの間で渡すことができるようにすることによってこれらの課題を解決することができる。
【００４２】
本開示のアウトオブバンドシグナリング技法は、幾つかの例では、ホストＣＰＵと１つ以上の計算デバイス、例えば、ＯｐｅｎＣＬ計算デバイス、との間でのシグナリングを実装するために用いることができる。アウトオブバンドシグナリングは、例えば、プッシュ又はプルメカニズムを用いて、高速のアウトオブバンド通知を提供することができる。幾つかの例では、アウトオブバンドシグナリング技法は、相対的に少量のデータを搬送することができる。
【００４３】
本開示の第２の態様により、ＧＰＵ以外のプロセッサにおいて実行中のプロセスにメッセージを送信すること及び実行中のプロセスからメッセージを受信することが可能なＧＰＵが提供される。例えば、ＧＰＵは、メッセージを送信及び受信するための１つ以上の動作を実装するように構成されるハードウェアを含むことができる。幾つかの例では、本開示により設計されたＧＰＵは、メッセージ渡しプロトコルと関連付けられた状態情報およびデータ情報を格納するように構成された１つ以上のホストがアクセス可能なレジスタを含むことができる。１つ以上のレジスタは、ＧＰＵで実行中のタスクとＧＰＵ以外のデバイスで実行中のプロセスとの間でのメッセージ渡しを容易にするように構成することができる。さらなる例では、ホストがアクセス可能なレジスタを介してメッセージを送信及び受信するためにＧＰＵのＡＬＵ処理ブロック（例えば、プログラマブルシェーダユニット）をホストがアクセス可能なレジスタに通信可能な形で結合することができる。ＧＰＵは、同期的及び／又は非同期的メッセージ渡し技法を実装するための様々なポーリング及び／又は割り込みメカニズムを含むように設計することもできる。
【００４４】
本開示の第３の態様により、即時（ｉｍｍｅｄｉａｔｅ）メモリオブジェクトを生成するのを可能にするメモリバッファインタフェースが提供される。即時メモリオブジェクトは、計算デバイスでタスクが実行している間にホストデバイスで実行中のプロセスと計算デバイスで実行中のタスクとの間でデータを共有するためにキャッシング不能な共有メモリスペース及び／又はキャッシュコヒーレントな共有メモリスペースを実装するために用いることができる。共有メモリスペースは、計算デバイス、例えば、ＧＰＵ、によるタスクの実行中にホストデバイス及び計算デバイスの両方によってアクセス可能なメモリスペースであることができる。ここにおいて用いられる場合におけるキャッシング不能な共有メモリスペースとは、ホストデバイス及び計算デバイスのうちの１つ又は両方における１つ以上の対応するキャッシュがメモリスペースに関してディスエーブルにされる共有メモリスペースを意味することができる。ここにおいて用いられる場合におけるキャッシュコヒーレントな共有メモリスペースとは、ホストデバイス及び計算デバイスのうちの１つ又は両方における１つ以上の対応するキャッシュ内でキャッシュコヒーレンシーを維持するために共有メモリキャッシュコヒーレンシー技法が用いられる共有メモリスペースを意味することができる。キャッシング不能な共有メモリスペース及びキャッシュコヒーレントな共有メモリスペースは、何時でもデータシェアリングを可能にすることができる。即時メモリオブジェクトは、幾つかの例では、ホストデバイス及び計算デバイスに関するキャッシング不能な揮発性の共有メモリとして及び／又はキャッシュコヒーレントな揮発性の共有メモリとして実装することができる。
【００４５】
幾つかの例では、本開示の即時メモリオブジェクトは、メモリオブジェクトメモリ管理方式を含む、プラットフォーム横断、売り主横断型の異種計算プラットフォーム、並列プログラミングＡＰＩ内に組み入れることができる。例えば、即時メモリオブジェクトは、ＯｐｅｎＣＬメモリオブジェクトの追加属性、例えば、ＯｐｅｎＣＬバッファオブジェクト又はＯｐｅｎＣＬ画像オブジェクト、としてＯｐｅｎＣＬ内に組み入れることができる。該例では、即時メモリオブジェクトは、メモリオブジェクト生成関数を変更して、関数呼び出しによって生成されて結果的に得られたメモリオブジェクトが標準モードメモリオブジェクト又は即時モードメモリオブジェクトのいずれであるべきかを指定するパラメータ又はフラグを含めることによって、生成することができる。この方法により、本開示の技法は、メモリオブジェクトメモリ管理方式、例えば、ＯｐｅｎＣＬ、を含むＡＰＩを実装するマルチプルプロセッサ計算システムがキャッシュコヒーレンシー問題の影響を受けない共有メモリスペースを介してのインフライトデータシェアリングを実装するのを可能にすることができる。
【００４６】
さらなる例では、本開示の即時メモリオブジェクトは、ホストＣＰＵとＯｐｅｎＣＬ計算デバイスとの間での又は異なるＯｐｅｎＣＬ計算デバイス間でのインフライトなデータシェアリングのために用いることができる。追加の例では、即時メモリオブジェクトは、内部同期化マーカを含むことができる。さらなる例では、即時メモリオブジェクトは、同期化のためにアウトオブバンド信号とともに用いることができる。
【００４７】
本開示の第４の態様により、キャッシング不能な共有メモリスペースを提供するために特定のメモリアドレス空間に関して選択的にディスエーブルにすることができる共有メモリスペースに対応するキャッシュを含むＧＰＵが提供される。例えば、ＧＰＵは、共有メモリスペースに関して読み取り動作及び／又は書き込み動作を実行するためにキャッシングサービスが使用されるべきかどうかを指定する情報を受信したことに応答して共有メモリスペースと関連付けられたキャッシュによって提供されるキャッシングサービスを選択的にイネーブル及びディスエーブルにすることができる。幾つかの例では、共有メモリスペースに関して読み取り動作及び／又は書き込み動作を実行するためにキャッシングサービスが使用されるべきかどうかを指定する情報は、特定の命令を実行するためにキャッシュドモード（ｃａｃｈｅｄ  ｍｏｄｅ）又は即時モード（ｉｍｍｄｅｉａｔｅ  ｍｏｄｅ）のいずれが使用されるべきかを指定するキャッシュドモード命令又は即時モード命令であることができる。さらなる例では、共有メモリスペースに関して読み取り動作及び／又は書き込み動作を実行するためにキャッシングサービスが使用されるべきかどうかを指定する情報は、メモリオブジェクトのために即時モードがイネーブルにされるかどうかを指定する即時モードメモリオブジェクト属性であることができる。
【００４８】
さらなる例では、本開示の技法は、キャッシュコヒーレントな共有メモリスペースを提供するために選択的にイネーブルにすることができるキャッシュコヒーレンシーモードを含むＧＰＵを提供することができる。幾つかの例では、ＧＰＵは、ホストデバイスから受信された１つ以上の命令に基づいて共有メモリスペースに対応するキャッシュの部分のためにキャッシュコヒーレンシーモードを選択的にイネーブルにすることができる。ホストデバイスは、ホストプロセスによって指定された即時モードパラメータに基づいてホストデバイスによる共有メモリスペースの割り当て時に共有メモリスペースに対応するキャッシュの部分のために共有メモリスペースキャッシュコヒーレンシーモードを選択的にイネーブルにするために１つ以上の命令をＧＰＵに出すことができる。
【００４９】
本開示のアウトオブバンドシグナリング技法及び即時バッファリング技法は、ＯｐｅｎＣＬコマンド待ち行列インタフェースのみを用いて入手可能になるタスク結合と比較してホストＣＰＵとＧＰＵとの間において又は２つのＯｐｅｎＣＬ計算デバイス間でより微細な粒子のそれを提供することができる。本開示の技法は、並列の及び／又はマルチスレッドのプログラムの効率的な実行を援助するためにマルチプルプロセッサ計算プラットフォームが様々な動作を行うことを可能にすることができる。例えば、本開示の技法は、ＧＰＵで実行中のタスクがＲＰＣを起動させることを可能にすることができる。他の例として、本開示の技法は、ＧＰＵで実行中のタスクが、ＣＰＵを介して、他のＧＰＵタスクを起動させることを可能にすることができる。さらなる例として、本開示の技法は、ＧＰＵで実行中のタスクがＣＰＵ及び／又はＣＰＵで実行中のドライバに対してリソース管理要求、例えば、メモリ割り当て要求及び／又はメモリ割り当て解除要求、を出すことを可能にすることができる。さらに他の例として、本開示の技法は、ＧＰＵで実行中のタスクが状態検査及びＣＰＵへの一般的なメッセージ渡し、例えば、アサーションメカニズムの実装、進行状況報告、及び／又は診断ロギング、を行うことを可能にすることができる。
【００５０】
図１は、本開示による計算システム例１０を示したブロック図である。計算システム１０は、複数の処理デバイスで１つ以上のソフトウェアアプリケーションを処理するように構成される。幾つかの例では、１つ以上のソフトウェアアプリケーションは、ホストプロセスを含むことができ、計算システム１０は、ホストプロセスを実行するように及び計算システム１０内のその他の計算デバイスでホストプロセスによって開始された１つ以上のタスクの実行を分散させるように構成することができる。さらなる例では、計算システム１０によって実行されるホストプロセス及び／又はタスクは、並列プログラミングモデルによりプログラミングすることができる。例えば、アプリケーションは、基礎になるハードウェアシステムのタスクレベルでの並列性及び／又はデータレベルでの並列性を利用するように設計された命令を含むことができる。
【００５１】
計算システム１０は、パソコン、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、ビデオゲームプラットフォーム又はコンソール、移動電話、例えば、セルラー又は衛星電話、携帯電話、ランドライン電話、インターネット電話、ハンドヘルドデバイス、例えば、ポータブルビデオゲーム機、又はパーソナルデジタルアシスタント（ＰＤＡ）、デジタルメディアプレーヤー、例えば、パーソナル音楽プレーヤー、ビデオプレーヤー、表示装置、テレビ、テレビセットトップボックス、サーバ、中間ネットワークデバイス、メインフレームコンピュータ又は情報を処理するその他のあらゆるタイプのデバイスであることができる。
【００５２】
計算デバイス１０は、ホストデバイス１２と、グラフィックス処理装置（ＧＰＵ）１４と、メモリ１６と、相互接続ネットワーク１８と、を含む。ホストデバイス１２は、マルチプルプロセッサ計算プラットフォームＡＰＩのためのホストプロセス及びランタイムモジュールの実行のためのプラットフォームを提供するように構成される。典型的には、ホストデバイス１２は、汎用ＣＰＵであるが、ホストデバイス１２は、プログラムを実行することが可能なあらゆるタイプのデバイスであることができる。ホストデバイス１２は、相互接続ネットワーク１８を介してＧＰＵ１４及びメモリ１６に通信可能な形で結合される。ホストデバイス１２は、ホストプロセス２０と、ランタイムモジュール２２と、を含み、それらの各々は、１つ以上のプログラミング可能なプロセッサのあらゆる組み合わせにおいて実行することができる。
【００５３】
ホストプロセス２０は、計算システム１０の計算システムプラットフォームでの実行のためのソフトウェアプログラムを形成する命令の組を含む。ソフトウェアプログラムは、エンドユーザ端末のために１つ以上の特定のタスクを実行するように設計することができる。該タスクは、幾つかの例では、計算システム１０によって提供される複数の処理デバイス及び並列アーキテクチャを利用することができる計算集約型のアルゴリズムを含むことができる。
【００５４】
ランタイムモジュール２２は、ホストプロセス２０に含まれる命令のうちの１つ以上にサービスを提供するように構成された１つ以上のインタフェースを実装するホストデバイス１２で実行するソフトウェアモジュールであることができる。ランタイムモジュール２２によって実装されたインタフェースは、コマンド待ち行列インタフェース２４と、ホストメッセージ渡しインタフェース２６と、を含む。幾つかの例では、ランタイムモジュール２２は、本開示で説明されるインタフェースに加えて標準的なマルチプルプロセッサシステムＡＰＩ内に含まれる１つ以上のインタフェースを実装することができる。幾つかの例では、標準的なＡＰＩは、異種計算プラットフォームＡＰＩ、プラットフォーム横断型ＡＰＩ、売り主横断型ＡＰＩ、並列プログラミングＡＰＩ、タスクレベル並列プログラミングＡＰＩ、及び／又はデータレベル並列プログラミングＡＰＩであることができる。さらなる例では、標準的なＡＰＩは、ＯｐｅｎＣＬ  ＡＰＩであることができる。該例では、ランタイムモジュール２２は、ＯｐｅｎＣＬ仕様のうちの１つ以上に準拠するように設計することができる。追加の例では、ランタイムモジュール２２は、ドライバプログラム、例えば、ＧＰＵドライバ、の一部として実装することができる。
【００５５】
コマンド待ち行列インタフェース２４は、ホストプロセス２０から１つ以上の待ち行列内追加命令を受信するように及び受信された命令によって指定された機能を実行するように構成される。幾つかの例では、コマンド待ち行列インタフェース２４は、ＯｐｅｎＣＬ仕様に準拠して設計することができる。例えば、コマンド待ち行列インタフェース２４は、コマンド待ち行列と対話するためにＯｐｅｎＣＬ仕様において指定された待ち行列内追加命令のうちの１つ以上を実装することができる。
【００５６】
本開示により、ホストメッセージ渡しインタフェース２６は、ホストプロセス２０から１つ以上のメッセージ渡し命令を受信するように及び受信された命令によって指定された機能を実行するように構成される。幾つかの例では、ホストメッセージ渡しインタフェース２６は、既存の標準ＡＰＩ、例えば、ＯｐｅｎＣＬ  ＡＰＩ、の拡張として実装することができる。追加の例では、ホストメッセージ渡しインタフェース２６は、既存の標準ＡＰＩ、例えば、ＯｐｅｎＣＬ  ＡＰＩ、内に組み入れることができる。
【００５７】
ＧＰＵ１４は、ホストデバイス１２から受信された命令に応答して１つ以上のタスクを実行するように構成される。ＧＰＵ１４は、１つ以上のプログラミング可能な処理素子を含むあらゆるタイプのＧＰＵであることができる。例えば、ＧＰＵ１４は、タスクのための複数の実行インスタンスを並行して実行するように構成される１つ以上のプログラマブルシェーダユニットを含むことができる。プログラマブルシェーダユニットは、バーテックス（頂点）シェーダユニット、フラグメントシェーダユニット、ジオメトリシェーダユニット及び／又は統合シェーダユニットを含むことができる。ＧＰＵ１４は、相互接続ネットワーク１８を介してホストデバイス１２及びメモリ１６に通信可能な形で結合される。ＧＰＵ１４は、タスク２８と、デバイスメッセージ渡しインタフェース３０と、を含む。タスク２８及びデバイスメッセージ渡しインタフェース３０は、１つ以上のプログラミング可能な処理素子のあらゆる組み合わせにおいて実行することができる。
【００５８】
タスク２８は、計算システム１０内の計算デバイスでの実行のためのタスクを形成する命令の組を備える。幾つかの例では、タスク２８のための命令の組は、ホストプロセス２０において定義し、幾つかの事例では、ホストデバイス１２で実行中のホストプロセス２０に含まれる命令によってコンパイルすることができる。さらなる例では、タスク２８は、ＧＰＵ１４で並行して実行中の複数の実行インスタンスを有するカーネルプログラムであることができる。該例においては、ホストプロセス２０は、カーネル実行インスタンスを実行するために各々の処理素子にカーネル実行インスタンスをマッピングするカーネル用のインデックススペースを定義することができ、ＧＰＵ１４は、そのカーネル用に定義されたインデックススペースによりタスク２８のための複数のカーネル実行インスタンスを実行することができる。
【００５９】
本開示により、デバイスメッセージ渡しインタフェース３０は、ホストプロセス２０から１つ以上のメッセージ渡し命令を受信するように及び受信された命令によって指定された機能を実行するように構成される。幾つかの例では、デバイスメッセージ渡しインタフェース３０は、既存の標準のＡＰＩの拡張として実装することができる。例えば、標準ＡＰＩは、標準的な計算デバイスＡＰＩ、例えば、ＯｐｅｎＣＬ  Ｃ  ＡＰＩ、であることができる。追加の例では、デバイスメッセージ渡しインタフェース３０は、既存の標準のＡＰＩ、例えば、ＯｐｅｎＣＬ  Ｃ  ＡＰＩ、内に組み入れることができる。
【００６０】
メモリ１６は、ホストデバイス１２及びＧＰＵ１４のうちの１つ又は両方による使用のためにデータを格納するように構成される。メモリ１６は、１つ以上の揮発性又は非揮発性のメモリ又は記憶デバイス、例えば、ランダムアクセスメモリ（ＲＡＭ）、スタティックＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）、読み取り専用メモリ（ＲＯＭ）、消去可能プログラマブルＲＯＭ（ＥＰＲＯＭ）、電気的に消去可能なプログラマブルＲＯＭ（ＥＥＰＲＯＭ）、フラッシュメモリ、磁気データ記憶媒体又は光学記憶媒体、のあらゆる組み合わせを含むことができる。メモリ１６は、相互接続ネットワーク１８を介してホストデバイス１２及びＧＰＵ１４に通信可能な形で結合される。メモリ１６は、コマンド待ち行列３２を含む。
【００６１】
コマンド待ち行列３２は、コマンド待ち行列インタフェース２４から受信されたコマンドを格納及び取り出すメモリ１６内に実装されたデータ構造であることができる。幾つかの例では、コマンド待ち行列３２は、特定の実行順序でコマンドを格納するバッファであることができる。
【００６２】
相互接続ネットワーク１８は、ホストデバイス１２、ＧＰＵ１４及びメモリ１６の間での通信を容易にするように構成される。相互接続ネットワーク１８は、当業において知られるあらゆるタイプの相互接続ネットワークであることができる。図１の計算システム例１０では、相互接続ネットワーク１８は、バスである。バスは、様々なバス構造、例えば、第３世代バス（例えば、ＨｙｐｅｒＴｒａｎｓｐｏｒｔバス又はＩｎｆｉｎｉＢａｎｄバス）、第２世代バス（例えば、Ａｄｖａｎｃｅｄ  Ｇｒａｐｈｉｃｓ  Ｐｏｒｔバス、Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ  Ｅｘｐｒｅｓｓ（ＰＣＩｅ）バス、又はＡｄｖａｎｃｅｄ  ｅＸｅｎｔｉｓｉｂｌｅ  Ｉｎｔｅｒｆａｃｅ（ＡＸＩ）バス）、又はその他のタイプのバスのうちの１つ以上を含むことができる。相互接続ネットワーク１８は、ホストデバイス１２、ＧＰＵ１４及びメモリ１６に結合される。
【００６３】
今度は、計算システム１０内のコンポーネントの構造及び機能がさらに詳細に説明される。上述されるように、ホストプロセス２０は、命令の組を含む。命令の組は、例えば、１つ以上の待ち行列内追加命令と、１つ以上のホストメッセージ渡し命令と、を含むことができる。追加の例では、命令の組は、ＧＰＵ１４で実行されるタスク又はカーネルを指定する命令と、コマンド待ち行列を生成してそれらのコマンド待ち行列を特定のデバイスと関連付ける命令と、プログラムをコンパイル及びバインドする命令と、カーネルパラメータを設定する命令と、インデックススペースを定義する命令と、デバイスコンテキストを定義する命令と、ホストプロセス２０によって提供される機能をサポートするその他の命令と、を含むことができる。
【００６４】
ホストプロセス２０は、コマンド待ち行列３２内に１つ以上のコマンドを入れるようにコマンド待ち行列インタフェース２４に命令する１つ以上の待ち行列内追加命令をコマンド待ち行列インタフェース２４に出すことによってコマンド待ち行列インタフェース２４と対話することができる。１つ以上の待ち行列内追加命令は、コマンド待ち行列３２内にメモリ転送コマンドを追加するようにコマンド待ち行列インタフェース２４に命令するメモリ転送待ち行列内追加命令を含むことができる。例えば、１つ以上の待ち行列内追加命令は、ホストデバイス１２と関連付けられたメモリスペースとＧＰＵ１４と関連付けられたメモリスペースとの間でデータを転送するようにホストデバイス１２、例えば、ホストデバイス１２で実行中のランタイムモジュール２２、に命令するコマンドを待ち行列に入れる命令を含むことができる。
【００６５】
メモリスペースは、ホストデバイス１２によるホストプロセス２０の実行中にホストデバイス１２によってアクセス可能である場合にホストデバイス１２と関連付けることができる。同様に、メモリスペースは、ＧＰＵ１４によるタスク２８の実行中にＧＰＵ１４によってアクセス可能である場合にＧＰＵ１４と関連付けることができる。ホストデバイス１２と関連付けられたメモリスペースは、ここでは、ホストメモリスペースと呼ぶことができ、ＧＰＵ１４と関連付けられたメモリスペースは、ここでは、デバイスメモリスペースと呼ぶことができる。幾つかの例では、メモリ１６は、ホストメモリスペース及びデバイスメモリスペースの両方の一部分を含むことができる。さらなる例では、ホストメモリスペース及びデバイスメモリスペースのうちの１つの又は両方の一部分は、図１の計算システム１０において示されていない１つ以上のその他のメモリデバイスに配置することができる。
【００６６】
幾つかの例では、ホストデバイス１２と関連付けられたメモリスペースとＧＰＵ１４と関連付けられたメモリスペースとの間でデータを転送するようにホストデバイス１２に命令するコマンドは、ホストメモリスペースの一部分に格納されたデータをデバイスメモリスペース内で割り当てられたバッファオブジェクトに転送するようにランタイムモジュール２２に命令するコマンドであることができる。該コマンドを待ち行列に入れるためにホストプロセス２０によって出された命令は、ここでは、書き込みバッファ待ち行列内追加命令と呼ぶことができる。幾つかの場合は、書き込みバッファ待ち行列内追加命令は、ＯｐｅｎＣＬ  ＡＰＩ仕様によって指定されたｃｌＥｎｑｕｅｕｅＷｒｉｔｅＢｕｆｆｅｒ（）関数の形態をとることができる。
【００６７】
追加の例では、ホストデバイス１２と関連付けられたメモリスペースとＧＰＵ１４と関連付けられたメモリスペースとの間でデータを転送するようにホストデバイス１２に命令するコマンドは、デバイスメモリスペース内で割り当てられたバッファオブジェクトに格納されたデータをホストメモリスペースの一部分に転送するようにランタイムモジュール２２に命令するコマンドであることができる。該コマンドを待ち行列に入れるためにホストプロセス２０によって出される命令は、ここでは、読み取りバッファ待ち行列内追加命令と呼ぶことができる。幾つかの場合は、読み取りバッファ待ち行列内追加命令は、ＯｐｅｎＣＬ  ＡＰＩ仕様によって指定されたｃｌＥｎｑｕｅｕｅＲｅａｄＢｕｆｆｅｒ（）関数の形態をとることができる。
【００６８】
１つ以上の待ち行列内追加命令は、コマンド待ち行列３２内にタスク実行コマンドを入れるようにコマンド待ち行列インタフェース２４に命令するタスク実行待ち行列内追加命令を含むこともできる。例えば、１つ以上の待ち行列内追加命令は、ＧＰＵ１４でタスクを実行するようにホストデバイス１２、例えば、ホストデバイス１２で実行中のランタイムモジュール２２、に命令するコマンドを待ち行列内に入れるための命令を含むことができる。幾つかの例では、タスクを実行するためのコマンドは、ＧＰＵ１４内の複数の処理素子でタスクの複数の実行インスタンスを並行して実行するためのコマンドであることができる。例えば、タスクは、カーネルであることができ、ホストプロセス２０は、カーネル実行インスタンスを実行するためにＧＰＵ１４内の各々の処理素子にカーネル実行インスタンスをマッピングするカーネル用のインデックススペースを定義することができる。該例では、タスクを実行するためのコマンドは、ＧＰＵ１４のために定義されたインデックススペースによりＧＰＵ１４でカーネルを実行するためのコマンドであることができる。幾つかの事例では、タスク実行待ち行列内追加命令は、ＯｐｅｎＣＬ  ＡＰＩによって指定されたｃｌＥｎｑｕｅｕｅＮＤＲａｎｇｅＫｅｒｎｅｌ（）関数の形態を取ることができる。
【００６９】
本開示により、ホストプロセス２０は、ホストメッセージ渡しインタフェース２６に１つ以上のホストメッセージ渡し命令を出してホストデバイス１２で実行中のホストプロセス２０とＧＰＵ１４で実行中のタスク２８との間で１つ以上のメッセージを渡すようにホストメッセージ渡しインタフェース２６に命令することによってホストメッセージ渡しインタフェース２６と対話することもできる。ホストメッセージ渡し命令は、ホストデバイス１２によって実行することができる。
【００７０】
ホストメッセージ渡し命令は、幾つかの例では、指定されたデバイスに指定されたデータを送信するようにホストデバイス１２に命令する送信命令を含むことができる。例えば、送信命令は、ホストデバイス１２で実行中のホストプロセス２０からＧＰＵ１４で実行中のタスク２８にメッセージを送信するようにホストメッセージ渡しインタフェース２６に命令することができる。幾つかの例では、送信命令は、メッセージが送信されるべき特定のデバイスを指定する第１の入力パラメータと、送信されるメッセージの内容を指定する第２の入力パラメータと、を含むことができる。
【００７１】
送信命令は、ブロッキング（ｂｌｏｃｋｉｎｇ）送信命令又は非ブロッキング（ｎｏｎ−ｂｌｏｃｋｉｎｇ）送信命令のいずれかであることができる。送信命令は、幾つかの例では、送信命令がブロッキング送信命令であるか又は非ブロッキング送信命令であるかを指定する第３の入力パラメータを含むことができる。ブロッキング送信命令は、呼び出しを行っているプロセス、例えば、ホストデバイス１２で実行中のホストプロセス２０、に戻る前に送信動作が完了されるまで待つことができる。非ブロッキング送信命令は、送信動作が完了されるまで待たずに呼び出しを行っているプロセスに戻ることができる。例えば、非ブロッキング送信命令は、特定の送信動作が成功であったかどうかを決定するために呼び出しを行っているプロセスによって後続して問い合わせることができるハンドルをその送信動作に戻すことができる。非ブロッキング送信命令は、失敗することがあり、失敗した場合は、呼び出しを行っているプロセスは、送信動作を再試行するために送信命令を再度出すことが必要な場合がある。
【００７２】
幾つかの例では、送信命令のためのインタフェースは、次の形態をとることができる。
【数１】
2013537993.tif 000003
【００７３】
ここで、ｃｌＳｅｎｄＯｕｔＯｆＢａｎｄＤａｔａは、命令識別子であり、ｃｌ＿ｄｅｖｉｃｅ  *ｄｅｖｉｃｅＩｄは、メッセージが送信されるべき特定のＯｐｅｎＣＬデバイスを指定する入力パラメータであり、ｉｎｔ  ＯＯＢ＿ｄａｔａは、送信されるメッセージの内容を指定する入力パラメータであり、ｂｏｏｌ  ｂｌｏｃｋｉｎｇは、命令がブロッキング送信命令であるか又は非ブロッキング送信命令であるかを指定する入力パラメータである。ブロッキング命令の場合は、命令は、送信動作が成功裏に完了されたかどうかを示すパラメータを戻すことができる。非ブロッキング送信命令の場合は、命令は、呼び出しを行っているプロセスによる後続する状態問い合わせのためのハンドルパラメータを戻すことができる。
【００７４】
ホストメッセージ渡し命令は、幾つかの例では、非同期的な方法で指定されたデバイスからデータを受信するためにコールバックをレジスタに入れるようにホストデバイス１２に命令するレジスタコールバックルーチン命令を含むことができる。例えば、レジスタコールバックルーチン命令は、ＧＰＵ１４で実行中のタスクがホストプロセス２０にメッセージを送信していることを示す信号をＧＰＵ１４から受信したことに応答してコールバックルーチンを呼び出すようにホストメッセージ渡しインタフェース２６に命令することができる。レジスタコールバックルーチン命令は、コールバックルーチンをレジスタに入れるべき対象となる特定のデバイスを指定する第１の入力パラメータと、コールバックルーチンのメモリ記憶場所を指定する第２の入力パラメータと、を含むことができる。
【００７５】
幾つかの例では、レジスタコールバックルーチン命令のためのインタフェースは、次の形態をとることができる。
【数２】
2013537993.tif 000004
【００７６】
ここで、ｃｌＲｅｇｉｓｔｅｒＯｕｔＯｆＢａｎｄＤａｔａＣａｌｌｂａｃｋは、命令識別子であり、ｃｌ＿ｄｅｖｉｃｅ  *ｄｅｖｉｃｅＩｄは、メッセージが送信されるべき特定のＯｐｅｎＣＬデバイスを指定する入力パラメータであり、ｖｏｉｄ（*）（ｉｎｔ）  ｃａｌｌＢａｃｋＰｔｒは、コールバックルーチンのメモリ記憶場所を指定する入力パラメータである。レジスタコールバックルーチン命令は、コールバックルーチンレジストレーション動作が成功裏に完了されたかどうかを示すパラメータを戻すことができる。
【００７７】
ホストメッセージ渡し命令は、幾つかの例では、指定されたデバイスからデータを読み取るのを試行するようにホストデバイス１２に命令するポーリング命令を含むことができる。例えば、ポーリング命令は、ＧＰＵ１４で実行中のタスク２８がメッセージを送信しているかどうかを示すメッセージ状態情報に関してＧＰＵ１４をポーリングするようにホストメッセージ渡しインタフェース２６に命令することができる。ポーリング命令は、ポーリングされるべき特定のデバイスを指定する入力パラメータと、存在する場合に、ポーリングの結果得られたデータを指定する出力パラメータと、を含むことができる。
【００７８】
幾つかの例では、ポーリング命令のためのインタフェースは、次の形態をとることができる。
【数３】
2013537993.tif 000005
【００７９】
ここで、ｃｌＴｒｙＲｅａｄＯｕｔＯｆＢａｎｄＤａｔａは、命令識別子であり、ｃｌ＿ｄｅｖｉｃｅ  *ｄｅｖｉｃｅＩｄは、ポーリングされるべき特定のＯｐｅｎＣＬデバイスを指定する入力パラメータであり、ｉｎｔ*ＯＯＢ＿ｄａｔａは、存在する場合に、ポーリングの結果得られたデータを指定する出力パラメータである。ポーリング命令は、ポーリング動作からデータが成功裏に得られたかどうかを示すパラメータを戻すことができる。
【００８０】
ホストプロセス２０と同様に、タスク２８は、計算デバイスによって実行される１つ以上のデバイスメッセージ渡し命令を含むことができる。デバイスメッセージ渡し命令は、ホストデバイス１２に指定されたデータを送信するように計算デバイスに命令する送信命令を含むことができる。例えば、送信命令は、ＧＰＵ１４で実行中のタスク２８からホストデバイス１２で実行中のホストプロセス２０にメッセージを送信するようにＧＰＵ１４に命令することができる。
【００８１】
送信命令は、ブロッキング送信命令又は非ブロッキング送信命令のいずれかであることができる。送信命令は、幾つかの例では、送信命令がブロッキング送信命令であるか又は非ブロッキング送信命令であるかを指定する第１の入力パラメータを含むことができる。ブロッキング送信命令は、呼び出しを行っているプロセス、例えば、ＧＰＵ１４で実行中のタスク２８、を停止させ、呼び出しを行っているプロセスに戻る前に送信動作が完了されるのを待つことができる。非ブロッキング送信命令は、送信動作が完了されるまで待たずに呼び出しを行っているプロセスに戻ることができる。例えば、非ブロッキング送信命令は、特定の送信動作が成功であったかどうかを決定するために後続して呼び出しを行っているプロセスによって問い合わせることができるハンドルをその送信動作に戻すことができる。非ブロッキング送信動作は、失敗することがあり、失敗した場合は、呼び出しを行っているプロセスは、送信動作を再試行するために送信命令を再度出すことが必要な場合がある。送信命令は、ホストデバイスに送信されるべきメッセージの内容を指定する第２の入力パラメータを含むことができる。
【００８２】
幾つかの例では、送信命令のためのインタフェースは、次の形態をとることができる。
【数４】
2013537993.tif 000006
【００８３】
ここで、ｓｅｎｄ＿ｏｏｂｄａｔａは、命令識別子であり、ｂｏｏｌ  ｂｌｏｃｋｉｎｇは、命令がブロッキング送信命令であるか又は非ブロッキング送信命令であるかを指定する入力パラメータであり、ｉｎｔ  ｄａｔａは、送信されるメッセージの内容を指定する入力パラメータである。ブロッキング命令の場合は、命令は、送信動作が成功裏に完了されたかどうかを示すパラメータを戻すことができる。非ブロッキング命令の場合は、命令は、呼び出しを行っているプロセスによる後続する状態問い合わせのためのハンドルパラメータを戻すことができる。
【００８４】
デバイスメッセージ渡し命令は、幾つかの例では、ホストデバイス１２からデータを受信するように計算デバイスに命令する受信命令を含むことができる。例えば、受信命令は、入手可能な場合にホストデバイス１２で実行中のホストプロセス２０からタスク２８に送信されたメッセージをＧＰＵ１４で実行中のタスク２８に提供するようにＧＰＵ１４、例えば、デバイスメッセージ渡しインタフェース３０、に命令することができる。該命令は、ポーリングメカニズムをサポートするために用いることができる。
【００８５】
受信命令は、ブロッキング受信命令又は非ブロッキング受信命令のいずれかであることができる。受信命令は、幾つかの例では、受信命令がブロッキング受信命令であるか又は非ブロッキング受信命令であるかを指定する入力パラメータを含むことができる。ブロッキング受信命令は、呼び出しを行っているプロセス、例えば、ＧＰＵ１４で実行中のタスク２８、を停止させ、呼び出しを行っているプロセスに戻る前にメッセージが入手可能になるまで待つことができる。非ブロッキング受信命令は、メッセージが入手可能になるまで待たずに呼び出しを行っているプロセスに戻ることができる。例えば、メッセージが入手可能である場合は、非ブロッキング送信命令は、そのメッセージを戻すことができる。しかしながら、メッセージが入手可能でない場合は、非ブロッキング受信命令は、失敗することがある。失敗した場合は、呼び出しを行っているプロセスは、受信動作を再試行するために受信命令を再度出すことが必要な場合がある。受信命令は、存在する場合に、受信動作の結果得られたデータを指定する出力パラメータを含むことができる。
【００８６】
幾つかの例では、受信命令のためのインタフェースは、次の形態をとることができる。
【数５】
2013537993.tif 000007
【００８７】
ここで、ｒｅｃｅｉｖｅ＿ｏｏｂｄａｔａは、命令識別子であり、ｂｏｏｌ  ｂｌｏｃｋｉｎｇは、命令がブロッキング受信命令であるか又は非ブロッキング受信命令であるかを指定する入力パラメータであり、ｉｎｔ  ｄａｔａは、存在する場合に、受信動作の結果得られたデータを指定する出力パラメータである。命令は、受信動作が成功裏に完了されたかどうかを示すパラメータを戻すことができる。
【００８８】
コマンド待ち行列インタフェース２４は、コマンド待ち行列３２内にコマンドを入れるように構成される。例えば、コマンド待ち行列インタフェース２４は、ホストプロセス２０から１つ以上の待ち行列内追加命令を受信し、ホストプロセス２０から１つ以上の待ち行列内追加命令を受信したことに応答してコマンド待ち行列３２内に１つ以上のコマンドを入れることができる。１つ以上の待ち行列内追加命令は、タスク実行コマンド及びデータ転送コマンドをそれぞれの待ち行列に入れるようにコマンド待ち行列インタフェース２４に命令するタスク実行待ち行列内追加命令とデータ転送待ち行列内追加命令とを含むことができる。
【００８９】
コマンド待ち行列インタフェース２４は、待ち行列３２に格納されたコマンドを実行するようにも構成される。データ転送コマンドに関しては、コマンド待ち行列インタフェース２４は、ホストメモリスペースとデバイスメモリスペースとの間でデータを転送することができる。例えば、書き込みバッファコマンドに関しては、コマンド待ち行列インタフェース２４は、ホストメモリスペースの一部分に格納されたデータをデバイスメモリスペース内で割り当てられたバッファオブジェクトに転送することができる。他の例として、読み取りバッファコマンドに関しては、コマンド待ち行列インタフェース２４は、デバイスメモリスペース内で割り当てられたバッファオブジェクトに格納されたデータをホストメモリスペースの一部分に転送することができる。デバイスメモリスペースは、コマンド待ち行列３２が関連付けられているデバイスに対応することができる。
【００９０】
タスク実行コマンドに関しては、コマンド待ち行列インタフェース２４は、タスクの実行をコマンド待ち行列と関連付けられたデバイスで開始させることができる。例えば、図１の例では、コマンド待ち行列３２は、ランタイムモジュール２２のコンテキスト内でＧＰＵ１４と関連付けられる。従って、タスク実行コマンドを実行するときには、コマンド待ち行列インタフェース２４は、ＧＰＵ１４での実行をタスクに開始させることができる。幾つかの例では、コマンド待ち行列インタフェース２４は、ＧＰＵ１４内に入っているローカルコマンド待ち行列内に１つ以上のコマンドを入れることによってＧＰＵ１４での実行をタスクに開始させることができる。その他の例では、コマンド待ち行列インタフェース２４は、タスクの実行を開始するようにＧＰＵ１４に命令する１つ以上の命令をＧＰＵ１４に送信することによってＧＰＵ１４での実行をタスクに開始させることができる。コマンド待ち行列インタフェース２４は、ＧＰＵ１４、メモリ１６、ホストメモリスペース及びデバイスメモリスペースと通信するために相互接続ネットワーク１８を用いることができる。
【００９１】
幾つかの例では、コマンド待ち行列インタフェース２４は、コマンドを順に実行することができる。該例では、第２のコマンドの前に第１のコマンドが待ち行列に入れられた場合は、第２のコマンドの実行は、第１のコマンドが実行を完了した後に開始する。さらなる例では、コマンド待ち行列インタフェース２４は、順不同でコマンドを実行することができる。該例では、第２のコマンドの前に第１のコマンドが待ち行列に入れられた場合でも、第２のコマンドの実行は、必ずしも第１のコマンドが実行を完了した後に開始するわけではない。
【００９２】
ホストメッセージ渡しインタフェース２６は、ホストプロセス２０から受信された１つ以上のメッセージ渡し命令を実行するように構成される。例えば、ホストプロセス２０から１つ以上のメッセージ渡し命令を受信したことに応答して、ホストメッセージ渡しインタフェース２６は、ＧＰＵ１４でタスク２８が実行している間にホストデバイス１２で実行中のホストプロセス２０とＧＰＵ１４で実行中のタスク２８との間で１つ以上のメッセージを渡すことができる。幾つかの例では、ホストメッセージ渡しインタフェース２６は、コマンド待ち行列３２内にコマンドを入れずに１つ以上のメッセージ渡し命令を実行することができる。
【００９３】
第１の例により、ホストプロセス２０から送信命令を受信したことに応答して、ホストメッセージ渡しインタフェース２６は、ＧＰＵ１４でタスク２８が実行している間にホストプロセス２０からタスク２８にメッセージを送信することができる。例えば、ホストメッセージ渡しインタフェース２６は、送信命令内に含まれたメッセージデータに基づいて発信メッセージを構成し、指定されたデバイスで実行中のタスク、例えば、タスク２８、への引き渡しのために、相互接続ネットワーク１８を介して、送信命令内で指定されたデバイス、例えば、ＧＰＵ１４、に発信メッセージを転送することができる。
【００９４】
第２の例により、ホストプロセス２０からレジスタコールバックルーチン命令を受信したことに応答して、ホストメッセージ渡しインタフェース２６は、命令内で指定されたコールバックルーチンを、指定されたデバイスで実行中のタスク、例えば、タスク２８、がメッセージを送信していることを示す、命令内で指定されたデバイス、例えば、ＧＰＵ１４、からの信号と関連付けることができる。幾つかの例では、デバイスからの信号は、割り込み信号であることができる。割り込み信号は、幾つかの例では、専用の割り込み信号ラインを介して引き渡すことができる。デバイスで実行中のタスクがメッセージを送信していることを示す信号を指定されたデバイスから受信したことに応答して、ホストメッセージ渡しインタフェース２６は、レジスタコールバックルーチン命令内で指定されたコールバックルーチンの実行を開始することができる。コールバックルーチンは、指定されたデバイス、例えば、ＧＰＵ１４、からタスク、例えば、タスク２８、によって送信されたメッセージを入手し、さらなる処理のためにホストプロセス２０にメッセージを戻すことができる。
【００９５】
第３の例により、ポーリング命令を受信したことに応答して、ホストメッセージ渡しインタフェース２６は、メッセージ状態情報に関して、命令内で指定されたデバイス、例えば、ＧＰＵ１４、をポーリングすることができる。ホストメッセージ渡しインタフェース２６は、デバイスをポーリングするために相互接続ネットワーク１８又は他のハードウェアに基づく通信経路を用いることができる。指定されたデバイス、例えば、ＧＰＵ１４、で実行中のタスク、例えば、タスク２８、がメッセージを送信していることをメッセージ状態情報が示す場合は、ホストメッセージ渡しインタフェース２６は、指定されたデバイスからメッセージを入手し、さらなる処理のためにホストプロセス２０にメッセージを戻すことができる。
【００９６】
デバイスメッセージ渡しインタフェース３０は、タスク２８から受信された１つ以上のデバイスメッセージ渡し命令を実行するように構成される。例えば、タスク２８から１つ以上のデバイスメッセージ渡し命令を受信したことに応答して、デバイスメッセージ渡しインタフェース３０は、ＧＰＵ１４でタスク２８が実行している間にＧＰＵ１４で実行中のタスク２８とホストデバイス１２で実行中のホストプロセス２０との間で１つ以上のメッセージを渡すことができる。
【００９７】
第１の例により、送信命令を受信したことに応答して、デバイスメッセージ渡しインタフェース３０は、ＧＰＵ１４で実行中のタスク２８からホストデバイス１２で実行中のホストプロセス２０にメッセージを送信することができる。例えば、デバイスメッセージ渡しインタフェース３０は、送信命令内に含まれるメッセージデータに基づいて発信メッセージを構成し、ホストプロセス２０への引き渡しのために、相互接続ネットワーク１８を介して、ホストデバイス１２に発信メッセージを転送することができる。
【００９８】
第２の例により、タスク２８から受信命令を受信したことに応答して、デバイスメッセージ渡しインタフェース３０は、ホストプロセス２０からのメッセージを入手可能であるどうかを決定することができる。幾つかの例では、デバイスメッセージ渡しインタフェース３０は、１つ以上のホストがアクセス可能なレジスタを検査してメッセージが入手可能であるかどうかを決定することができる。ホストプロセス２０からのメッセージを入手可能である場合は、デバイスメッセージ渡しインタフェース３０は、タスク２８にメッセージを提供することができる。
【００９９】
コマンド待ち行列インタフェース２４及びホストメッセージ渡しインタフェース２６は、図１のホストプロセス２０とは別個のコンポーネントとして例示されるが、幾つかの例では、コマンド待ち行列インタフェース２４及びホストメッセージ渡しインタフェース２６のうちの１つ又は両方の機能は、部分的に及び／又は完全にコンパイルしてホストプロセス２０に入れることができる。同様に、幾つかの例では、デバイスメッセージ渡しインタフェース３０の機能は、部分的に及び／又は完全にコンパイルしてタスク２８内に入れることができる。
【０１００】
例示を容易にするために、図１において示される計算システム例１０は、ＧＰＵ１４を計算デバイスとして使用する本開示のメッセージ渡し技法について説明する。しかしながら、本開示の技法は、ＧＰＵ１４に加えての又はＧＰＵ１４に代わるＧＰＵ以外の計算デバイスを有するマルチプルプロセッサ計算システムに対して適用可能であることが認識されるべきである。幾つかの例では、計算デバイスは、ＯｐｅｎＣＬ計算デバイスであることができる。ＯｐｅｎＣＬ計算デバイスは、１つ以上の計算ユニットを含む。計算ユニットの各々は、１つ以上の処理素子を含む。例えば、計算ユニットは、計算ユニット内の全処理素子によって用いることができるオンチップ共有メモリを有する処理素子、例えば、ＡＬＵ、の集まりであることができる。ワークアイテム（ｗｏｒｋ  ｉｔｅｍ）は、コマンド待ち行列内に入れられたコマンドによってＯｐｅｎＣＬ計算デバイスで呼び出されたカーネル又はタスクの複数の並行実行のうちの１つであることができる。各ワークアイテムは、その他の処理素子で実行中のその他のワークアイテムと並行して計算ユニット内の個々の処理素子で実行することができる。ワークグループは、単一のカーネル実行コマンドの一部として計算デバイス内の単一の計算ユニットにおいて処理される１つ以上のワークアイテムの集合であることができる。ＯｐｅｎＣＬホストは、ＯｐｅｎＣＬランタイムレイヤを実行するために用いられるプラットフォームの中央ＣＰＵであることができる。
【０１０１】
ＯｐｅｎＣＬ  ＡＰＩは、ホストデバイスと異なるタイプの計算デバイスとの間での対話のための共通のインタフェースの組を提供することができる。例えば、ＯｐｅｎＣＬ  ＡＰＩは、ホストとＧＰＵ計算デバイス及びホストと非ＧＰＵ計算デバイスとの間の対話のための共通のインタフェースを提供することができる。ＯｐｅｎＣＬ  ＡＰＩは、様々な計算デバイスでタスク（例えば、
ＯｐｅｎＣＬカーネル）を実行するために共通のインタフェースをホストが使用するのを可能にする。幾つかの例では、タスクは、汎用計算タスクであることができ、ＯｐｅｎＣＬ  ＡＰＩは、ホストがＧＰＵ計算デバイスで汎用計算タスクを実行させることを可能にすることができる。
【０１０２】
図１に示される計算システム例１０は、ホストデバイスと計算デバイスとの間でのメッセージ渡し及び／又はアウトオブバンドシグナリングを容易にするためのインフラストラクチャ及び技法を例示する。しかしながら、その他の計算システム例では、それらの技法は、２つ以上の計算デバイスを有する計算システム内の異なる計算デバイス（例えば、ＯｐｅｎＣＬ計算デバイス）間でのインフライトのメッセージ渡しを提供するために容易に拡張することができる。該例では、異なる計算デバイス間で１本以上の割り込みラインを配線することができる。
【０１０３】
図２は、本開示による図１の計算システム１０において使用することができるＧＰＵ例４０を示したブロック図である。幾つかの例では、図１において例示されたＧＰＵ１４を実装するためにＧＰＵ４０を用いることができる。ＧＰＵ４０は、ＧＰＵ処理ブロック４２と、ホストがアクセス可能なＧＰＵレジスタ４４と、バスコントローラ４６と、を含む。ＧＰＵ４０は、相互接続ネットワーク１８を介して１つ以上のその他のホストデバイス又は計算デバイスと通信可能な形で結合させることができる。
【０１０４】
ＧＰＵ処理ブロック４２は、タスクを実行するように及びＧＰＵ処理ブロック４２で実行中のタスクとその他のホスト又は計算デバイスで実行中のプロセスとの間でのメッセージ渡しを容易にするように構成される。ＧＰＵ処理ブロック４２は、例えば、１本以上の制御及び／又はデータラインを介して、ホストがアクセス可能なＧＰＵレジスタ４４に通信可能な形で結合される。幾つかの例では、ＧＰＵ処理ブロック４２は、算術論理装置（ＡＬＵ）ブロックと呼ぶことができる。ＧＰＵ処理ブロック４２は、タスク４８と、メッセージ渡しモジュール５０と、着信データレジスタ５２と、発信データレジスタ５４と、を含む。
【０１０５】
ホストがアクセス可能なＧＰＵレジスタ４４は、ホストデバイスに又はホストデバイスから通信することができるデータを格納するように構成される。ホストがアクセス可能なＧＰＵレジスタ４４は、メッセージ状態レジスタ５６と、メッセージカウントレジスタ５８と、着信メッセージレジスタ６０と、発信メッセージレジスタ６２と、割り込み状態レジスタ６４と、割り込み確認応答レジスタ６６と、を含む。ホストがアクセス可能なＧＰＵレジスタ４４の各々は、ホストデバイス、例えば、図１のホストデバイス１２、によってアクセス可能であることができる。幾つかの例では、ホストがアクセス可能なＧＰＵレジスタ４４は、メモリマッピングされたレジスタ、すなわち、ホストデバイスのメモリスペースにマッピングされてアドレス指定が可能なレジスタ、であることができる。さらなる例では、ホストがアクセス可能なＧＰＵレジスタ４４は、入力／出力マッピングされた（Ｉ／Ｏマッピングされた）レジスタ、すなわち、ホストデバイスのＩ／Ｏスペースにマッピングされたレジスタ、であることができる。ホストがアクセス可能なＧＰＵレジスタ４４は、１本以上の制御及び／又はデータラインを介してＧＰＵ処理ブロック４２に通信可能な形で結合される。ホストがアクセス可能なＧＰＵレジスタ４４は、相互接続ネットワーク１８を介してバスコントローラ４６にも通信可能な形で結合される。
【０１０６】
タスク４８は、１つ以上のプログラミング可能なプロセッサで実行することができる。幾つかの例では、ＧＰＵ処理ブロック４２は、タスク４８の複数の実行インスタンスを実行するように構成された複数のプロセッサ又は処理素子を含むことができる。タスク４８は、図１に関して上述されるタスク２８と実質的に類似することができ、従って、さらに詳細には説明されない。
【０１０７】
メッセージ渡しモジュール５０は、ＧＰＵ４０によって行われるメッセージ渡し動作を制御するように構成される。メッセージ渡しモジュール５０は、ハードウェア、ソフトウェア、ファームウェア又はそれらのあらゆる組み合わせ内に実装することができる。幾つかの例では、メッセージ渡しモジュール５０の機能の一部又は全部がソフトウェア内に実装される場合は、該実装のためのソフトウェア命令は、タスク４８のためのソフトウェア命令を含む実行可能ファイルと同じ実行可能ファイル内に含めることができる。メッセージ渡しモジュール５０は、タスク４８、メッセージ渡しモジュール５０、着信データレジスタ５２及び発信データレジスタ５４に通信可能な形で結合される。
【０１０８】
メッセージ渡しモジュール５０は、１つ以上のプロセッサでタスク４８が実行している間に及びタスク４８から１つ以上のメッセージ渡し命令を受信したことに応答してそれらの１つ以上のプロセッサで実行中のタスク４８とホストデバイスで実行中のプロセスとの間で、ホストがアクセス可能なＧＰＵレジスタ４４を介して、１つ以上のメッセージを渡すことができる。幾つかの例では、１つ以上のメッセージ渡し命令は、タスク４８からホストデバイスで実行中のプロセスにメッセージを送信するようにメッセージ渡しモジュール５０に命令する送信命令を含むことができる。該例では、メッセージ渡しモジュール５０は、ホストがアクセス可能なＧＰＵレジスタ４４のうちの１つ内にメッセージと関連付けられたメッセージデータを格納することができる。さらなる例では、１つ以上のメッセージ渡し命令は、入手可能な場合にホストデバイスで実行中のプロセスからタスク４８に送信されたメッセージをタスク４８に提供するようにメッセージ渡しモジュール５０に命令する受信命令を含むことができる。該例では、メッセージ渡しモジュール５０は、ホストがアクセス可能なＧＰＵレジスタ４４のうちの１つ以上からメッセージと関連付けられたメッセージデータを入手することができる。
【０１０９】
図２の例における着信データレジスタ５２は、着信メッセージレジスタ６０を介して外部のデバイスから受信された着信データを格納するハードウェアレジスタである。着信データレジスタ５２は、着信データレジスタ５２内のデータが消費されているかどうか及び／又は着信データレジスタ５２内のデータが読み取りのために入手可能であるかどうかを示す状態ビットも格納することができる。着信データレジスタ５２は、１本以上のデータラインを介して着信メッセージレジスタ６０と通信可能な形で結合される。幾つかの例では、データライン数は、着信データレジスタ５２内のビット数と等しいことができ、それらの両方とも、メッセージ内のビット数と等しいことができる。さらなる例では、ビット数は、３２ビットであることができる。幾つかの例では、ＧＰＵ処理ブロック４２は、着信データレジスタ５２から受信された複数の着信メッセージを格納するための内部の先入れ先出し（ＦＩＦＯ）バッファを実装することができる。
【０１１０】
図２の例における発信データレジスタ５４は、タスク４８によって出された１つ以上のメッセージ渡し命令から受信された発信データを格納するハードウェアレジスタである。発信データレジスタ５４は、１本以上のデータラインを介して発信メッセージレジスタ６２と通信可能な形で結合される。幾つかの例では、データライン数は、発信データレジスタ５４内のビット数と等しいことができ、それらの両方とも、メッセージ内のビット数と等しいことができる。幾つかの例では、発信データレジスタ５４及び発信メッセージレジスタ６２は、メッセージ渡しモジュール５０が発信データレジスタ５４にデータを書き込んだときに、発信メッセージレジスタ６２が発信データレジスタ５４に書き込まれたデータによって自動的に更新されるような形で構成することができる。幾つかの例では、ＧＰＵ処理ブロック４２は、発信データレジスタ５４に書き込まれるべき複数の発信メッセージを格納するための内部の先入れ先出し（ＦＩＦＯ）バッファを実装することができる。
【０１１１】
図２の例におけるメッセージ状態レジスタ５６は、着信メッセージがＧＰＵ４０によって受け入れられたかどうかを示すデータを格納するように構成される。メッセージ状態レジスタ５６は、メッセージが成功裏に送信されたかどうかを決定するために、そして幾つかの例では、バックオフ（ｂａｃｋ−ｏｆｆ）及び／又はオーバーフローメカニズムを実装するためにホストデバイスによって用いることができる。着信メモリを受け入れた後は、メッセージ渡しモジュール５０は、着信メッセージが受け入れられたことを示す特定の値にメッセージ状態レジスタ５６を設定することができる。
【０１１２】
図２の例におけるメッセージカウントレジスタ５８は、着信メッセージレジスタ６０に着信メッセージが入っているかどうかを示すデータを格納するように構成される。幾つかの例では、メッセージカウントレジスタ５８は、メッセージカウントレジスタ５８がホストデバイスによって増分されたときにメッセージの到着を示すための信号をメッセージ渡しモジュール５０に送信することができる。幾つかの事例では、信号は、１ビットパルスラインであることができる。さらなる例では、メッセージ渡しモジュール５０は、着信データレジスタ５２からメッセージを読み取った後にメッセージカウントレジスタ５８を減分することができる。
【０１１３】
図２の例における着信データレジスタ６０は、着信メッセージデータを格納するように構成される。例えば、ホストデバイスは、タスク４８にメッセージを送信するために着信メッセージデータを着信メッセージレジスタ６０内に入れることができる。着信メッセージレジスタ６０は、着信データレジスタ５２と通信可能な形で結合される。
【０１１４】
図２の例における発信メッセージレジスタ６２は、発信データレジスタ５４から受信された発信メッセージデータを格納するように構成される。発信メッセージレジスタ６２は、発信データレジスタ５４に新しいデータが書き込まれたときに発信データレジスタ５４に対応するために発信メッセージレジスタ６２内のデータを自動的に更新することができる。幾つかの例では、メッセージ渡しモジュール５０は、発信メッセージレジスタ６２に発信メッセージが書き込まれたことに応答して割り込み信号を生成することができる。割り込み信号は、ホストデバイスに送信し、メッセージ渡しモジュール５０がメッセージを送信していることを示すことができる。
【０１１５】
図２の例における割り込み状態レジスタ６４は、発信メッセージレジスタ６２に発信メッセージが書き込まれているかどうかを示す状態ビットを格納するように構成される。例えば、割り込み状態レジスタ６４及び発信メッセージレジスタ６２は、発信メッセージレジスタ６２に発信メッセージが書き込まれたときに割り込み状態レジスタ６４内の状態ビットが設定されるように構成することができる。状態ビットは、ホストデバイスで実行中のプロセスがメッセージを入手可能であるかどうかを確認するためにＧＰＵ４０をポーリングするのを可能にすることができる。
【０１１６】
図２の例における割り込み確認応答レジスタ６６は、ホストデバイスが発信メッセージレジスタ６２に格納された発信メッセージを読み取ったかどうかを示す確認応答ビットを格納するように構成される。例えば、発信メッセージレジスタ６２及び割り込み確認応答レジスタ６６は、発信メッセージレジスタ６２に発信メッセージが書き込まれたときに割り込み確認応答レジスタ６６内の確認応答ビットが設定されるような形で構成することができる。該例では、ホストデバイスが発信メッセージレジスタ６２を読み取った後に、ホストデバイスは、確認応答ビットをクリアし、それにより、ホストデバイスが発信メッセージを読み取っており新しい発信メッセージを発信メッセージレジスタ６２に書き込むことができることを示すことができる。確認応答ビットは、発信メッセージデータのための流れ制御方式を実装するために用いることができる。
【０１１７】
図２の例におけるバスコントローラ４６は、外部のデバイスが相互接続ネットワーク１８を介してホストがアクセス可能なＧＰＵレジスタ４４にアクセスするのを可能にするように構成される。例えば、バスコントローラ４６は、バス信号を多重化及び多重解除し、バス信号によって指定された様々な受信及び送信動作を行うことができる。バスコントローラ４６は、１つ以上の公的な又は独占的なバス規格により動作することができる。
【０１１８】
今度は、マルチプルプロセッサ計算システム内でのメッセージ渡しのための様々な技法が、本開示の幾つかの態様により説明される。幾つかの例では、図１の計算システム１０は、図３乃至１９に示される技法例を実装するために用いることができる。説明を容易にするために、それらの技法は、図１に示される計算システム例１０のコンポーネントに関して説明されるが、それらの技法は、同じ又は異なる構成内の同じ又は異なるコンポーネントを有するその他のシステムで実行できることが理解されるべきである。追加の例では、図３乃至１９に示される技法の一部は、図２のＧＰＵ４０の特定のコンポーネントに関して説明することができる。繰り返すと、図２は、本開示の技法を実装することができるＧＰＵの一例にすぎないこと、及び該技法は、同じ又は異なる構成内の同じ又は異なるコンポーネントを有するその他のＧＰＵによって実行できることが理解されるべきである。
【０１１９】
図３は、本開示によるマルチプルプロセッサプラットフォーム環境におけるメッセージ渡しのための技法例を示す。幾つかの例では、図３に示される技法例を実装するために図１の計算システム１０を用いることができる。コマンド待ち行列インタフェース２４は、コマンド待ち行列３２内にメモリ転送コマンドを入れる（７０）。コマンド待ち行列インタフェース２４は、コマンド待ち行列３２内にタスク実行コマンドを入れる（７２）。コマンド待ち行列インタフェース２４は、ＧＰＵ１４でのタスクの実行を開始するためにタスク実行コマンドを実行する（７４）。ホストメッセージ渡しインタフェース２６は、ＧＰＵ１４でタスク２８が実行している間にホストデバイス１２とＧＰＵ１４との間で１つ以上のメッセージを渡す（７６）。例えば、ホストメッセージ渡しインタフェース２６は、ホストプロセス２０によって出された１つ以上の送信命令から生じるメッセージをＧＰＵ１４に渡すことができる。１つ以上の送信命令は、ＧＰＵ１４又はＧＰＵ１４で実行中のタスクがメッセージの行先であることを指定することができる。
【０１２０】
図４は、本開示によるホストデバイスで実行中のプロセスによって出された送信命令を実行するための技法例である。幾つかの例では、図４に示される技法例を実装するために図１の計算システム１０を用いることができる。ホストメッセージ渡しインタフェース２６は、ホストプロセス２０から送信命令を受信する（７８）。ホストメッセージ渡しインタフェース２６は、送信命令とともに含まれるメッセージデータに基づいて発信メッセージを生成する（８０）。幾つかの例では、発信メッセージは、送信命令に含まれるメッセージデータと同一であることができる。追加の例では、ホストメッセージ渡しインタフェース２６は、発信メッセージを生成するために送信命令に含まれるメッセージデータに１つ以上のヘッダ情報及び／又はルーティング情報を添付することができる。さらなる例では、ホストメッセージ渡しインタフェース２６は、発信メッセージを生成するために送信命令に含まれるメッセージデータに対して１つ以上のコーディング又は変換動作を行うことができる。ホストメッセージ渡しインタフェース２６は、ＧＰＵ１４に発信メッセージを送信することができる（８２）。
【０１２１】
ホストメッセージ渡しインタフェース２６は、送信命令がブロッキング命令であるか又は非ブロッキング命令であるかを決定することができる（８４）。幾つかの例では、ホストメッセージ渡しインタフェース２６は、送信命令において指定された入力パラメータに基づいて送信命令がブロッキング命令であるか又は非ブロッキング命令であるかの決定を行うことができる。その他の例では、２つの異なるタイプの送信命令を用いることができ、及び命令のタイプ、例えば、命令の演算コード（オプコード）に基づいて命令がブロッキング命令であるか又は非ブロッキング命令であるかの決定を行うことができる。送信命令が非ブロッキング命令であるとホストメッセージ渡しインタフェース２６が決定した場合は、ホストメッセージ渡しインタフェース２６は、呼び出しを行っているプロセスにハンドルを戻すことができる（８６）。ハンドルは、呼び出しを行っているプロセスが、メッセージが成功裏に送信されているかどうかをのちに決定するためにハンドルに問い合わせるのを可能にすることができる。送信が失敗であったことを後続する問い合わせが示した場合は、呼び出しを行っているプロセスは、送信動作を再試行するための後続する送信命令を出す必要がある場合がある。幾つかの例では、呼び出しを行っているプロセスは、失敗した送信動作に応答してバックオフルーチン又はオーバーフローメカニズムを実装することができる。
【０１２２】
送信命令がブロッキング命令であるとホストメッセージ渡しインタフェース２６が決定した場合は、ホストメッセージ渡しインタフェース２６は、発信メッセージがＧＰＵ１４によって成功裏に受信されたかどうかを決定することができる（８８）。発信メッセージが成功裏に受信されたとホストメッセージ渡しインタフェース２６が決定した場合は、ホストメッセージ渡しインタフェース２６は、送信命令に含まれているメッセージが成功裏に送信されたことを示す値を呼び出しを行っているプロセスに戻すことができる（９０）。そうでない場合、発信メッセージが成功裏に受信されなかったとホストメッセージ渡しインタフェース２６が決定した場合は、ホストメッセージ渡しインタフェース２６は、プロセスブロック８２に進み、ＧＰＵ１４に発信メッセージを再送信することができる。ブロッキング命令は、幾つかの例では、メッセージが成功裏に受信されたか又は不成功の引き渡しの試行のスレショルド数に達しているとホストメッセージ渡しインタフェース２６が決定したときには、完了することができる。
【０１２３】
図５は、本開示による図４のプロセスブロック８２を実装するために用いることができる技法例を示した流れ図である。幾つかの例では、図５に示される技法例を実装するために図１の計算システム１０及び／又は図２のＧＰＵ４０を用いることができる。ホストメッセージ渡しインタフェース２６は、ＧＰＵ４０の着信メッセージレジスタ６０に発信メッセージを入れる又は格納することができる（９２）。ホストメッセージ渡しインタフェース２６は、新しいメッセージが到着していることをＧＰＵ１４内のメッセージ渡しモジュール５０に示すためにＧＰＵ４０のメッセージカウントレジスタ５８を増分することができる。幾つかの例では、ホストメッセージ渡しインタフェース２６は、プロセスブロック９２及び９４のうちの１つ以上を実行するために当業において知られるメモリマッピングされたレジスタハードウェア及び／又はＩ／Ｏマッピングされたレジスタハードウェアを用いることができる。
【０１２４】
図６は、本開示による図４の判断ブロック８８を実装するために用いることができる技法例を示した流れ図である。幾つかの例では、図６に示される技法例を実装するために図１の計算システム１０及び／又は図２のＧＰＵ４０を用いることができる。ホストメッセージ渡しインタフェース２６は、ＧＰＵ４０のメッセージ状態レジスタ５６内の状態ビットを検査することができる（９６）。ホストメッセージ渡しインタフェース２６は、メッセージ状態レジスタ５６内の状態ビットに基づいて送信されたメッセージがＧＰＵ１４によって受け入れられたかどうかを決定することができる（９８）。送信されたメッセージがＧＰＵ１４によって受け入れられたことを状態ビットが示す場合は、ホストメッセージ渡しインタフェース２６は、発信メッセージが成功裏に受信されたと決定することができる（１００）。他方、送信されたメッセージがＧＰＵ１４によって受け入れられなかったことを状態ビットが示す場合は、ホストメッセージ渡しインタフェース２６は、発信メッセージが成功裏に受信されなかったと決定することができる（１０２）。
【０１２５】
図７は、計算デバイス、例えば、ＧＰＵ、において受信されたメッセージを処理するための技法例を示した流れ図である。幾つかの例では、図７に示される技法例を実装するために図２のＧＰＵ４０を用いることができる。ＧＰＵ４０内のメッセージ渡しモジュール５０がメッセージ到着信号を受信する（１０４）。例えば、メッセージカウントレジスタ５８は、ホストデバイスがメッセージカウントレジスタ５８を増分するごとにメッセージ到着パルスがメッセージ渡しモジュール５０に送信されるような形で構成することができる。メッセージ渡しモジュール５０は、着信メッセージレジスタ６０に格納されたデータを着信データレジスタ５２に転送させることができる（１０６）。例えば、メッセージ渡しモジュール５０は、着信データレジスタ５２に制御信号を出し、着信メッセージレジスタ６０に格納されたデータを着信データレジスタ５２に格納された現在のデータに上書きするのを着信データレジスタ５２に行わせることができる。メッセージ渡しモジュール５０は、着信データレジスタ５２内でデータを入手可能である、例えば、消費されていない、ことを示すように着信データレジスタ５２内の状態ビットを設定することができる（１０８）。メッセージ渡しモジュール５０は、着信メッセージがＧＰＵ４０によって受け入れられていることを示すためにメッセージ状態レジスタ５６内の状態ビットを設定することができる（１１０）
図８は、本開示による計算デバイスで実行中のタスクによって出された受信命令を実行するための技法例を示した流れ図である。幾つかの例では、図８に示される技法例を実装するために図１の計算デバイス１０を用いることができる。デバイスメッセージ渡しインタフェース３０が、タスク２８から受信命令を受信する（１１２）。デバイスメッセージ渡しインタフェース３０は、ホストデバイスからメッセージを入手可能であるかどうかを決定する（１１４）。
【０１２６】
メッセージが入手可能でないとメッセージ渡しモジュール５０が決定した場合は、メッセージ渡しモジュール５０は、受信命令がブロッキング受信命令であるか又は非ブロッキング受信命令であるかを決定することができる（１１６）。幾つかの例では、メッセージ渡しモジュール５０は、受信命令内で指定された入力パラメータに基づいて受信命令がブロッキング命令であるか又は非ブロッキング命令であるかの決定を行うことができる。その他の例では、２つの異なるタイプの受信命令を用いることができ、メッセージ渡しモジュール５０は、命令のタイプ、例えば、命令の演算コード（オプコード）、に基づいて受信命令がブロッキング命令であるか又は非ブロッキング命令であるかの決定を行うことができる。受信命令がブロッキング命令であるとメッセージ渡しモジュール５０が決定した場合は、メッセージ渡しモジュール５０は、判断ブロック１１４に戻って着信メッセージを入手可能であるかどうかを決定することができる。そうでない場合、命令が非ブロッキング命令であるとメッセージ渡しモジュール５０が決定した場合は、メッセージ渡しモジュール５０は、受信命令が失敗したことを示す値を呼び出しを行っているプロセスに戻すことができる（１１８）。
【０１２７】
ホストデバイスからメッセージを入手可能であるとメッセージ渡しモジュール５０が決定した場合は、メッセージ渡しモジュール５０は、呼び出しを行っているプロセスにメッセージデータを戻すことができる（１２０）。メッセージ渡しモジュール５０は、メッセージデータが消費されていると表示すべきであるかどうかを決定する（１２２）。メッセージ渡しモジュール５０は、１つ以上の消費モードに基づいてデータを消費されていると表示すべきかどうかを決定することができる。幾つかの例では、消費モードは、ＧＰＵ１４内にハードワイヤすることができる。追加の例では、消費モードは、タスク２８及び／又はホストプロセス２０のいずれかによってプログラミングすることができる。例えば、タスク２８又はホストプロセス２０における送信及び／又は受信命令は、特定の消費モードを指定するパラメータを入れることができる。例えば、一消費モードは、タスクの少なくとも１つの実行インスタンスがデータを読み取ったときにメッセージデータを消費されたと表示すべきであると指定することができる。他の例として、一消費モードは、タスクの少なくともスレショルド数の実行インスタンスがデータを読み取ったときにメッセージデータを消費されたと表示すべきであると指定することができる。
【０１２８】
メッセージデータが消費されたと表示すべきであるとメッセージ渡しモジュール５０が決定した場合は、メッセージ渡しモジュール５０は、メッセージデータをクリアすることができる（１２４）。例えば、メッセージ渡しモジュール５０は、着信データレジスタ５２内の状態ビットをクリアすることができる。他方、メッセージデータが消費されたと表示すべきでないとメッセージ渡しモジュール５０が決定した場合は、メッセージ渡しモジュール５０は、メッセージデータを保持することができる（１２６）。例えば、メッセージ渡しモジュール５０は、着信データレジスタ５２内の状態ビットをクリアすることができない。
【０１２９】
図９は、本開示による図８の判断ブロック１１４を実装するために用いることができる技法例を示した流れ図である。幾つかの例では、図９に示される技法例を実装するために図１の計算システム１０及び／又は図２のＧＰＵ４０を用いることができる。メッセージ渡しモジュール５０は、ＧＰＵ４０の着信データレジスタ５２内の状態ビットを読み取ることができる（１２８）。メッセージ渡しモジュール５０は、状態ビットが設定されているかどうかを決定することができる（１３０）。着信データレジスタ５２内の状態ビットが設定されている場合は、メッセージ渡しモジュール５０は、着信メッセージが入手可能であると決定することができる（１３２）。他方、着信データレジスタ５２内の状態ビットが設定されていない場合は、メッセージ渡しモジュール５０は、着信メッセージを入手できないと決定することができる（１３４）。
【０１３０】
図１０は、本開示による図８のプロセスブロック１２０を実装するために用いることができる技法例を示した流れ図である。幾つかの例では、図１０に示される技法例を実装するために図１の計算システム１０及び／又は図２のＧＰＵ４０を用いることができる。メッセージ渡しモジュール５０は、ＧＰＵ４０内の着信データレジスタ５２から着信メッセージデータを取り出すことができる（１３６）。メッセージ渡しモジュール５０は、着信データレジスタ５２から取り出されたメッセージデータに基づいてタスク４８のための戻りメッセージデータを生成することができる（１３８）。幾つかの例では、戻されるメッセージデータは、着信データレジスタ５２に入ったメッセージデータと同一であることができる。追加の例では、メッセージ渡しモジュール５０は、戻りメッセージデータを生成するために着信データレジスタ５２に入っているメッセージデータから１つ以上のヘッダ情報及び／又はルーティング情報を取り除くことができる。さらなる例では、メッセージ渡しモジュール５０は、戻りメッセージデータを生成するために着信データレジスタ５２に入っているメッセージデータに対して１つ以上の復号動作又は変換動作を行うことができる。メッセージ渡しモジュール５０は、タスク４８にメッセージデータを提供する（１４０）。
【０１３１】
図１１は、本開示による計算デバイス、例えば、ＧＰＵ１４、で実行中のプロセスによって出された送信命令を実行するための技法例である。幾つかの例では、図１１に示される技法例を実装するために図１の計算システム１０を用いることができる。メッセージ渡しモジュール５０は、タスク２８から送信命令を受信する（１４２）。メッセージ渡しモジュール５０は、送信命令とともに含まれているメッセージデータに基づいて発信メッセージを生成する（１４４）。幾つかの例では、発信メッセージは、送信命令に入っているメッセージデータと同一であることができる。追加の例では、メッセージ渡しモジュール５０は、発信メッセージを生成するために送信命令に入っているメッセージデータに１つ以上のヘッダ情報及び／又はルーティング情報を添付することができる。さらなる例では、メッセージ渡しモジュール５０は、発信メッセージを生成するために送信命令に入っているメッセージデータに対して１つ以上のコーディング動作又は変換動作を行うことができる。メッセージ渡しモジュール５０は、ホストデバイス１２に発信メッセージを送信することができる（１４６）。
【０１３２】
メッセージ渡しモジュール５０は、送信命令がブロッキング命令であるか又は非ブロッキング命令であるかを決定することができる（１４８）。幾つかの例では、メッセージ渡しモジュール５０は、送信命令において指定された入力パラメータに基づいて送信命令がブロッキング命令であるか又は非ブロッキング命令であるかの決定を行うことができる。その他の例では、２つの異なるタイプの送信命令を用いることができ、メッセージ渡しモジュール５０は、命令のタイプ、例えば、命令の演算コード（オプコード）、に基づいて送信命令がブロッキング命令であるか又は非ブロッキング命令であるかの決定を行うことができる。送信命令が非ブロッキング命令であるとメッセージ渡しモジュール５０が決定した場合は、メッセージ渡しモジュール５０は、呼び出しを行っているプロセス、例えば、タスク２８、にハンドルを戻すことができる（１５０）。ハンドルは、呼び出しを行っているプロセスが、メッセージが成功裏に送信されているかどうかをのちに決定するためにハンドルに問い合わせるのを可能にすることができる。送信動作が失敗であったことを後続する問い合わせが示した場合は、呼び出しを行っているプロセスは、送信動作を再試行するための後続する送信命令を出す必要があることがある。
【０１３３】
送信命令がブロッキング命令であるとメッセージ渡しモジュール５０が決定した場合は、メッセージ渡しモジュール５０は、発信メッセージがホストデバイス１２によって成功裏に受信されたかどうかを決定することができる（１５２）。例えば、メッセージ渡しモジュール５０は、メッセージが受け入れられたことを示すホストデバイス１２に入った状態レジスタをポーリングすることができる。発信メッセージが成功裏に受信されたとメッセージ渡しモジュール５０が決定した場合は、メッセージ渡しモジュール５０は、送信命令に入ったメッセージが成功裏に受信されたことを示す値を呼び出しを行っているプロセスに戻すことができる（１５４）。そうでない場合、発信メッセージが成功裏に受信されなかったとメッセージ渡しモジュール５０が決定した場合は、メッセージ渡しモジュール５０は、プロセスブロック１４６に進み、ホストデバイス１２に発信メッセージを再送信することができる。ブロッキング命令は、幾つかの例では、メッセージが成功裏に受信されたか又はスレショルド数の不成功引き渡し試行に達しているとメッセージ渡しモジュール５０が決定したときに完了することができる。
【０１３４】
図１２は、本開示による図１１のプロセスブロック１４６を実装するために用いることができる技法例を示した流れ図である。幾つかの例では、図１２に示される技法例を実装するために図１の計算システム１０及び／又は図２のＧＰＵ４０を用いることができる。メッセージ渡しモジュール５０は、発信データレジスタ５４に発信メッセージを入れる又は格納することができる（１５６）。発信メッセージレジスタ６２は、新しいデータが発信データレジスタ５４内に入れられたことに応答して発信データレジスタ５４に対応するために発信メッセージレジスタ６２内のデータを更新することができる（１５８）。メッセージ渡しモジュール５０は、ＧＰＵ４０のタスク２８からメッセージを入手可能であることを示す割り込み信号を生成してホストデバイス１２に送信することができる（１６０）。
【０１３５】
図１３は、本開示による図１１のプロセスブロック１４６を実装するために用いることができる他の技法例である。幾つかの例では、図１３に示される技法例を実装するために図１の計算システム１０及び／又は図２のＧＰＵ４０を用いることができる。メッセージ渡しモジュール５０は、発信データレジスタ５４に発信メッセージを入れる又は格納することができる（１６２）。発信メッセージレジスタ６２は、新しいデータが発信データレジスタ５４内に入れられたことに応答して発信データレジスタ５４に対応するために発信メッセージレジスタ６２内のデータを更新することができる（１６４）。メッセージ渡しモジュール５０は、ＧＰＵ４０のタスク２８からメッセージを入手可能であることを示すために割り込み状態レジスタ６４内の状態ビットを設定することができる。状態ビットは、ホストデバイス１２がメッセージを入手可能であるかどうかを決定するためにＧＰＵ４０をポーリングするのを可能にするように設定することができる（１６６）。
【０１３６】
図１４は、本開示によるホストデバイスで実行中のプロセスによって出されたレジスタコールバックルーチン命令を実行するための技法例を示した流れ図である。幾つかの例では、図１４に示される技法例を実装するために図１の計算システム１０を用いることができる。ホストメッセージ渡しインタフェース２６は、ホストプロセス２０からレジスタコールバックルーチン命令を受信する（１６８）。ホストメッセージ渡しインタフェース２６は、レジスタコールバックルーチン命令において指定されたコールバックルーチンを、命令内で指定されたデバイス、例えば、ＧＰＵ１４、からの割り込み信号と関連付ける（１７０）。幾つかの例では、割り込み信号は、指定されたデバイスで実行中のタスク、例えば、ＧＰＵ１４で実行中のタスク２８、がメッセージを送信していることを示すことができる。割り込み信号は、幾つかの例では、ホストデバイス１２とＧＰＵ１４との間で結合された専用割り込み信号ラインを介して引き渡すことができる。さらなる例では、割り込み信号は、タスク２８がメッセージを送信することに加えてのその他のイベントを示すことができる。該例では、ホストメッセージ渡しインタフェース２６は、複数のイベントのうちのいずれが割り込み信号によって示されているかを決定するためにその割り込み信号を受信後に追加処理を行うことができる。
【０１３７】
ホストメッセージ渡しインタフェース２６は、コールバックルーチンが割り込み信号と成功裏に関連付けられたかどうかを決定する（１７２）。コールバックルーチンが割り込み信号と成功裏に関連付けられた場合は、ホストメッセージ渡しインタフェース２６は、レジスタコールバックルーチン動作が成功裏に完了されたことを示す値を呼び出しを行っているプロセスに戻すことができる（１７４）。そうでない場合、コールバックルーチンが割り込み信号と成功裏に関連付けられなかった、例えば、エラーが発生した、場合は、ホストメッセージ渡しインタフェース２６は、レジスタコールバックルーチン動作が失敗したことを示す値を呼び出しを行っているプロセスに戻すことができる（１７６）。
【０１３８】
図１５は、本開示による計算デバイスから受信された割り込みを処理するための技法例を示した流れ図である。幾つかの例では、図１５に示される技法例を実装するために図１の計算システム１０を用いることができる。ホストメッセージ渡しインタフェース２６は、計算デバイス、例えば、ＧＰＵ１４、から割り込み信号を受信する（１７８）。ホストメッセージ渡しインタフェース２６は、割り込み信号がメッセージ受信イベントに応答して送信されかどうかを決定する（１８０）。換言すると、ホストメッセージ渡しインタフェース２６は、デバイスで実行中のタスク、例えば、ＧＰＵ１４で実行中のタスク２８、がメッセージを送信していることを割り込み信号が示すかどうかを決定することができる。
【０１３９】
幾つかの例では、割り込み信号は、メッセージ受信イベントをシグナリングしてその他のイベントはシグナリングしない専用割り込み信号であることができる。該例では、ホストメッセージ渡しインタフェース２６は、割り込み信号自体を受信したことによってメッセージ受信イベントに応答して割り込み信号が送信され、その他の動作は必ずしも行う必要がないと決定することができる。割り込み信号が複数の潜在的イベントをシグナリングする例では、ホストメッセージ渡しインタフェース２６は、いずれのイベントがシグナリングされたかを決定するために計算デバイスに問い合わせることが必要な場合がある。
【０１４０】
割り込み信号がメッセージ受信イベントに応答して送信されたのではないとホストメッセージ渡しインタフェース２６が決定した場合は、ホストメッセージ渡しインタフェース２６は、その他のタイプのイベントの存在を検査することができる（１８２）。そうでない場合、割り込み信号がメッセージ受信イベントに応答して送信されたとホストメッセージ渡しインタフェース２６が決定した場合は、ホストメッセージ渡しインタフェース２６は、メッセージを送信したデバイスと関連付けられたコールバックルーチンを実行することができる（１８４）。
【０１４１】
図１６は、本開示による図１５の判断ブロック１８０を実装するために用いることができる技法例を示した流れ図である。幾つかの例では、図１６に示される技法例を実装するために図１の計算システム１０及び／又は図２のＧＰＵ４０を用いることができる。ホストメッセージ渡しインタフェース２６は、ＧＰＵ４０内の割り込み状態レジスタ６４を読み取ることができる（１８６）ホストメッセージ渡しインタフェース２６は、ホストデバイスのために新しいメッセージを入手可能であることを割り込み状態レジスタ６４内の状態ビットが示すかどうかを決定することができる（１８８）。例えば、メッセージ渡しモジュール５０は、メッセージが入手可能であるときには割り込み状態レジスタ６４内の状態ビットを設定することができ、ホストメッセージ渡しインタフェース２６は、ホストデバイスのために新しいメッセージを入手可能であるかどうかを決定するために状態ビットが設定されているかどうかを決定するために割り込み状態レジスタ６４をポーリングすることができる。ホストデバイスのために新しいメッセージを入手可能であると状態ビットが示す場合は、ホストメッセージ渡しインタフェース２６は、割り込み信号がメッセージ受信イベントに応答して送信されたと決定することができる（１９０）。他方、ホストデバイスのために新しいメッセージを入手可能でないと状態ビットが示す場合は、ホストメッセージ渡しインタフェース２６は、割り込み信号がメッセージ受信イベントに応答して送信されたのではないと決定することができる（１９２）。
【０１４２】
図１７は、本開示による図１５のプロセスブロック１８４を実装するために用いることができる技法例を示した流れ図である。幾つかの例では、図１７に示される技法例を実装するために図１の計算システム１０及び／又は図２のＧＰＵ４０を用いることができる。ホストメッセージ渡しインタフェース２６は、ＧＰＵ４０内の発信メッセージレジスタ６２からメッセージを取り出すことができる（１９４）。ホストメッセージ渡しインタフェース２６は、割り込み確認応答レジスタ６６内の確認応答ビットをクリアすることができる（１９６）。確認応答ビットをクリアすることは、ＧＰＵ４０の流れ制御において役立つことができる。例えば、ＧＰＵ４０は、発信メッセージレジスタ６２に発信メッセージが書き込まれるときに割り込み確認応答レジスタ６６内の確認応答ビットを設定し、発信メッセージレジスタ６２に追加データを書き込む前に確認応答ビットがクリアされるまで待つことができる。
【０１４３】
図１８は、本開示によるホストデバイスで実行中のプロセスによって出された読み取り命令を実行するための技法例を示した流れ図である。幾つかの例では、図１８に示される技法例を実装するために図１の計算システム１０を用いることができる。ホストメッセージ渡しインタフェース２６は、データが読み取られる特定のデバイスを指定する読み取り命令を受信する（１９８）。ホストメッセージ渡しインタフェース２６は、読み取り命令で指定されたデバイスをポーリングする（２００）。ホストメッセージ渡しインタフェース２６は、ポーリング動作から受信されたポーリングデータに基づいて受信命令で指定されたデバイスからメッセージを入手可能であるかどうかを決定する（２０２）。受信命令で指定されたデバイスからメッセージを入手可能であるとホストメッセージ渡しインタフェース２６が決定した場合は、ホストメッセージ渡しインタフェース２６は、読み取り命令で指定されたデバイスからメッセージを取り出すことができる（２０４）。幾つかの例では、ホストメッセージ渡しインタフェース２６は、ホストデバイス１２にアクセス可能なデバイス内のレジスタ、例えば、ＧＰＵ４０内の発信メッセージレジスタ６２、からメッセージを取り出すことができる。ホストメッセージ渡しインタフェース２６は、呼び出しを行っているプロセス、例えば、ホストプロセス２０、にメッセージデータを戻すことができる（２０６）。受信命令で指定されたデバイスからメッセージを入手可能でないとホストメッセージ渡しインタフェース２６が決定した場合は、ホストメッセージ渡しインタフェース２６は、読み取り命令が失敗したことを示す値を戻すことができる（２０８）。呼び出しを行っているプロセスは、読み取り動作を再試行するために読み取り命令を再度出すことが必要になる場合がある。
【０１４４】
図１９は、本開示による図１８の判断ブロック２０２を実装するために用いることができる技法例を示した流れ図である。幾つかの例では、図１９に示される技法例を実装するために図１の計算システム１０及び／又は図２のＧＰＵ４０を用いることができる。ホストメッセージ渡しインタフェース２６は、ＧＰＵ４０内の割り込み状態レジスタ６４を読み取ることができる（２１０）。ホストメッセージ渡しインタフェース２６は、ホストデバイスのために新しいメッセージを入手可能であることを割り込み状態レジスタ６４内の状態ビットが示すかどうかを決定することができる（２１２）。例えば、メッセージ渡しモジュール５０は、メッセージが入手可能なときは割り込み状態レジスタ６４内の状態ビットを設定することができ、ホストメッセージ渡しインタフェース２６は、ホストデバイスのために新しいメッセージが入手可能であるかどうかを決定するために状態ビットが設定されているかどうかを決定するために割り込み状態レジスタ６４をポーリングすることができる。状態ビットが設定されている場合は、ホストメッセージ渡しインタフェース２６は、メッセージを入手可能であると決定することができる（２１４）。他方、状態ビットが設定されていない場合は、ホストメッセージ渡しインタフェース２６は、メッセージが入手可能でないと決定することができる（２１６）。
【０１４５】
ホストメッセージ渡しインタフェース２６及びデバイスメッセージ渡しインタフェース３０によって実装されたメッセージ渡し技法は、ホストデバイス１２とＧＰＵ１４との間でのアウトオブバンドシグナリングを提供するものとして上述されているが、その他の例では、アウトオブバンドシグナリングを提供するためにその他の技法を用いることができる。例えば、幾つかの例では、特殊な高優先度待ち行列を定義することができ、アウトオブバンドメッセージを送信するためにそれを用いることができる。
【０１４６】
図２０は、本開示による即時メモリオブジェクトの使用を容易にすることができる計算システム例３１０を示したブロック図である。計算システム３１０は、複数の処理デバイスにおいて１つ以上のソフトウェアアプリケーションを処理するように構成される。幾つかの例では、１つ以上のアプリケーションは、ホストプロセスを含むことができ、計算システム３１０は、ホストプロセスを実行するように及び計算３１０内のその他の計算デバイス上でホストデバイスによって開始された１つ以上のタスクの実行を分散させるように構成することができる。さらなる例では、計算システム３１０によって実行されるホストプロセス及び／又はタスクは、並列プログラミングモデルによりプログラミングすることができる。例えば、アプリケーションは、基礎になるハードウェアシステムのタスクレベルでの並列性及び／又はデータレベルでの並列性を利用するように設計される命令を含むことができる。
【０１４７】
計算システム３１０は、パソコン、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、ビデオゲームプラットフォーム又はコンソール、移動電話、例えば、セルラー又は衛星電話、携帯電話、ランドライン電話、インターネット電話、ハンドヘルドデバイス、例えば、ポータブルビデオゲーム機又はパーソナルデジタルアシスタント（ＰＤＡ）、デジタルメディアプレーヤー、例えば、パーソナル音楽プレーヤー、ビデオプレーヤー、表示装置、テレビ、テレビセットトップボックス、サーバ、中間ネットワークデバイス、メインフレームコンピュータ又は情報を処理するその他のあらゆるタイプのデバイスを備えることができる。
【０１４８】
計算デバイス３１０は、ホストデバイス３１２と、ＧＰＵ３１４と、メモリ３１６と、相互接続ネットワーク３１８と、を含む。ホストデバイス３１２は、マルチプルプロセッサ計算プラットフォームＡＰＩのためのホストプロセス及びランタイムモジュールの実行のためのプラットフォームを提供するように構成される。典型的には、ホストデバイス３１２は、汎用ＣＰＵであるが、ホストデバイス１２は、プログラムを実行することが可能なあらゆるタイプのデバイスであることができる。ホストデバイス１２は、相互接続ネットワーク３１８を介してＧＰＵ３１４及びメモリ３１６に通信可能な形で結合される。ホストデバイス３１２は、ホストプロセス３２０と、ランタイムモジュール３２２と、ホストキャッシュ３２４と、ホストキャッシュ制御モジュール制御３２６と、を含む。ホストプロセス３２０及びランタイムモジュール３２２は、１つ以上のプログラミング可能なプロセッサのあらゆる組み合わせにおいて実行することができる。
【０１４９】
ホストプロセス３２０は、計算システム３１０プラットフォームでの実行のためのソフトウェアプログラムを形成する命令の組を含む。ソフトウェアプログラムは、エンドユーザのために１つ以上の特定のタスクを実行するように設計することができる。該タスクは、幾つかの例では、計算システム３１０によって提供される複数の処理デバイス及び並列アーキテクチャを利用することができる計算集約型アルゴリズムを含むことができる。
【０１５０】
ランタイムモジュール３２２は、ホストプロセス３２０に含まれる命令のうちの１つ以上にサービスを提供するように構成された１つ以上のインタフェースを実装するソフトウェアモジュールであることができる。ランタイムモジュール３２２によって実装されたインタフェースは、メモリバッファインタフェース３２８を含む。幾つかの例では、ランタイムモジュール３２２は、メモリバッファインタフェース３２８に加えて、図１に示されるコマンド待ち行列インタフェース２４及び図１に示されるホストメッセージ渡しインタフェース２６のうちの１つ以上を実装することができる。さらなる例では、ランタイムモジュール３２２は、本開示で説明されるインタフェースに加えて標準的なマルチプルプロセッサシステムＡＰＩ内に含まれる１つ以上のインタフェースを実装することができる。幾つかの例では、標準的なＡＰＩは、異種計算プラットフォームＡＰＩ、プラットフォーム横断型ＡＰＩ、売り主横断型ＡＰＩ、並列プログラミングＡＰＩ、タスクレベル並列プログラミングＡＰＩ、及び／又はデータレベル並列プログラミングＡＰＩであることができる。さらなる例では、標準的なＡＰＩは、ＯｐｅｎＣＬ  ＡＰＩであることができる。該例では、ランタイムモジュール３２２は、ＯｐｅｎＣＬ仕様のうちの１つ以上に準拠するように設計することができる。追加の例では、ランタイムモジュール３２２は、ドライバプログラム、例えば、ＧＰＵドライバ、の一部として実装することができる。
【０１５１】
メモリバッファインタフェース３２８は、ホストプロセス２０から１つ以上のメモリオブジェクト生成命令を受信するように及び受信された命令によって指定された機能を実行するように構成される。幾つかの例では、メモリバッファインタフェース３２８は、既存の標準ＡＰＩ、例えば、ＯｐｅｎＣＬ  ＡＰＩ、の拡張として、実装することができる。追加の例では、コマンド待ち行列インタフェース２４は、既存の標準ＡＰＩ、例えば、ＯｐｅｎＣＬ  ＡＰＩ、内に組み入れることができる。
【０１５２】
ホストキャッシュ３２４は、ホストデバイス３１２内で実行中のプロセスによる使用のためのデータを格納するように構成される。幾つかの例では、ホストキャッシュ３２４に格納されたデータと関連付けられたメモリスペースは、メモリ３１６内のメモリスペースの一部分とオーバーラップすることができる。ホストキャッシュ３２４は、当業において知られるあらゆるタイプのキャッシュであることができる。例えば、ホストキャッシュ３２４は、キャッシュレベル（例えば、Ｌ１、Ｌ２、等）及び／又はマッピング方式（例えば、直接マッピング、完全関連付け、セット関連付け、等）のあらゆる組み合わせを含むことができる。ホストキャッシュ制御モジュール３２６は、ホストキャッシュ３２４の動作を制御するように構成される。
【０１５３】
ＧＰＵ３１４は、ホストデバイス３１２から受信された命令に応答して１つ以上のタスクを実行するように構成される。ＧＰＵ３１４は、１つ以上のプログラミング可能なプロセッサ又は処理素子を含むあらゆるタイプのＧＰＵであることができる。例えば、ＧＰＵ３１４は、タスクのための複数の実行インスタンスを並行して実行するように構成される１つ以上のプログラマブルシェーダユニットを含むことができる。プログマブルシェーダユニットは、バーテックスシェーダユニット、フラグメントシェーダユニット、ジオメトリシェーダユニット及び／又は統合シェーダユニットを含むことができる。ＧＰＵ３１４は、相互接続ネットワーク３１８を介してホストデバイス３１２及びメモリ３１６に通信可能な形で結合される。ＧＰＵ３１４は、タスク３３０と、ＧＰＵキャッシュ３３２と、ＧＰＵキャッシュ制御モジュール３３４と、を含む。タスク３３０は、１つ以上のプログラミング可能な処理素子のあらゆる組み合わせにおいて実行することができる。
【０１５４】
タスク３３０は、計算システム３１０内の計算デバイスでの実行のためのタスクを形成する命令の組を備える。幾つかの例では、タスク３３０のための命令の組は、ホストプロセス３２０において定義し、幾つかの事例では、ホストプロセス３２０に含まれる命令によってコンパイルすることができる。さらなる例では、タスク３３０は、ＧＰＵ３１４で並行して実行中の複数の実行インスタンスを有するカーネルプログラムであることができる。該例では、ホストプロセス３２０は、カーネル実行インスタンスを実行するために各々の処理素子にカーネル実行インスタンスをマッピングするカーネル用のインデックススペースを定義することができ、ＧＰＵ３１４は、そのカーネル用に定義されたインデックススペースによりタスク３３０のための複数のカーネル実行インスタンスを実行することができる。
【０１５５】
ＧＰＵキャッシュ３３２は、ＧＰＵ３１４内で実行中のタスクによる使用のためのデータを格納するように構成される。幾つかの例では、ＧＰＵキャッシュ３３２に格納されたデータと関連付けられたメモリスペースは、メモリ３１６内のメモリスペースの一部分とオーバーラップすることができる。ＧＰＵキャッシュ３３２は、当業において知られるあらゆるタイプのキャッシュであることができる。例えば、ＧＰＵキャッシュ３３２は、キャッシュレベル（例えば、Ｌ１、Ｌ２、等）及び／又はマッピング方式（例えば、直接マッピング、完全関連付け、セット関連付け、等）のあらゆる組み合わせを含むことができる。ＧＰＵキャッシュ制御モジュール３３４は、ＧＰＵキャッシュ３３２の動作を制御するように構成される。
【０１５６】
メモリ３１６は、ホストデバイス３１２及びＧＰＵ３１４のうちの１つ又は両方による使用のためにデータを格納するように構成される。メモリ３１６は、１つ以上の揮発性又は非揮発性のメモリ又は記憶デバイス、例えば、ランダムアクセスメモリ（ＲＡＭ）、スタティックＲＡＭ（ＳＲＡＭ）、ダイナミックＲＡＭ（ＤＲＡＭ）、読み取り専用メモリ（ＲＯＭ）、消去可能プログラマブルＲＯＭ（ＥＰＲＯＭ）、電気的に消去可能なプログラマブルＲＯＭ（ＥＥＰＲＯＭ）、フラッシュメモリ、磁気データ記憶媒体又は光学記憶媒体、のあらゆる組み合わせを含むことができる。メモリ３１６は、相互接続ネットワーク３１８を介してホストデバイス３１２及びＧＰＵ３１４に通信可能な形で結合される。メモリ３１６は、共有メモリスペース３３６を含む。共有メモリスペース３３６は、ホストデバイス３１２及びＧＰＵ３１４の両方によってアクセス可能なメモリスペースであることができる。
【０１５７】
相互接続ネットワーク３１８は、ホストデバイス３１２、ＧＰＵ３１４及びメモリ３１６の間での通信を容易にするように構成される。相互接続ネットワーク３１８は、当業において知られるあらゆるタイプの相互接続ネットワークであることができる。図２０の計算システム例３１０では、相互接続ネットワーク３１８は、バスである。バスは、様々なバス構造、例えば、第３世代バス（例えば、ＨｙｐｅｒＴｒａｎｓｐｏｒｔバス又はＩｎｆｉｎｉＢａｎｄバス）、第２世代バス（例えば、Ａｄｖａｎｃｅｄ  Ｇｒａｐｈｉｃｓ  Ｐｏｒｔバス、Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ  Ｅｘｐｒｅｓｓ（ＰＣＩｅ）バス、又はＡｄｖａｎｃｅｄ  ｅＸｅｎｔｉｓｉｂｌｅ  Ｉｎｔｅｒｆａｃｅ（ＡＸＩ）バス）、又はその他のタイプのバスのうちの１つ以上を含むことができる。相互接続ネットワーク３１８は、ホストデバイス３１２、ＧＰＵ３１４及びメモリ３１６に結合される。
【０１５８】
今度は、計算システム３１０内のコンポーネントの構造及び機能がさらに詳細に説明される。上述されるように、ホストプロセス３２０は、命令の組を含む。命令の組は、例えば、１つ以上のメモリオブジェクト生成命令を含むことができる。追加の例では、命令の組は、ＧＰＵ１４で実行されるタスク又はカーネルを指定する命令と、コマンド待ち行列を生成してそれらのコマンド待ち行列を特定のデバイスと関連付ける命令と、プログラムをコンパイル及びバインドする命令と、カーネルパラメータを設定する命令と、インデックススペースを定義する命令と、デバイスコンテキストを定義する命令と、待ち行列内追加命令と、メッセージ渡し命令と、ホストプロセス３２０によって提供される機能をサポートするその他の命令と、を含むことができる。
【０１５９】
本開示により、ホストプロセス３２０は、メモリオブジェクトのために即時モードがイネーブルにされるかどうかを指定する命令に含まれる情報に基づいてメモリオブジェクトを生成するようにメモリバッファインタフェース３２８に命令する１つ以上のメモリオブジェクト生成命令をメモリバッファインタフェース３２８に出すことによってメモリバッファインタフェース３２８と対話することができる。ここにおいて用いられる場合において、メモリオブジェクトは、ＧＰＵ３１４によってアクセス可能なメモリスペースの領域を表すソフトウェアオブジェクトを意味することができる。幾つかの例では、メモリスペースの領域は、ホストデバイス３１２によってもアクセス可能であることができる。メモリオブジェクトは、メモリオブジェクトと関連付けられたメモリスペース内に入ったデータを含むことができる。メモリオブジェクトは、メモリスペースと関連付けられた１つ以上の特徴をさらに含むことができる。幾つかの例では、メモリオブジェクトは、グローバルメモリ、例えば、メモリ３１６、の基準のカウントされた領域へのハンドルを含むことができる。
【０１６０】
メモリオブジェクトは、バッファオブジェクトと画像オブジェクトと、を含むことができる。バッファオブジェクトは、一次元のバイトの集合を格納するメモリオブジェクトであることができる。一次元のバイトの集合は、メモリオブジェクトと関連付けられたデータであることができる。バッファオブジェクトは、情報、例えば、バイトが単位のバッファオブジェクトと関連付けられたメモリスペースのサイズ、バッファオブジェクトのための使用法情報、及びバッファオブジェクトのために割り当てられたメモリスペースの領域を含むこともできる。画像オブジェクトは、二次元又は三次元の配列のデータ、例えば、テクスチャ、フレームバッファ又は画像、を格納する。画像オブジェクトは、情報、例えば、画像の次元、画像内の各要素の記述、画像オブジェクトのための使用法情報、画像オブジェクトのために割り当てられたメモリスペースの領域、を含むこともできる。
【０１６１】
本開示の幾つかの態様により、メモリオブジェクト生成命令は、生成されるべきメモリオブジェクトのために即時モードがイネーブルにされるべきかどうかを指定する入力パラメータを含むことができる。ここにおいてさらに詳細に説明されるように、即時モードがイネーブルにされるときには、メモリオブジェクトは、キャッシング不能な共有メモリとして及び／又はキャッシュコヒーレントな共有メモリとして実装することができる。即時モードがディスエーブルにされるときには、メモリオブジェクトは、必ずしもキャッシング不能な共有メモリとして及び／又はキャッシュコヒーレントな共有メモリとして実装されないことがある。
【０１６２】
幾つかの例では、メモリオブジェクトは、メモリオブジェクトが即時モードメモリオブジェクトであるかどうかを示す即時モード属性を含むことができる。該例では、メモリバッファインタフェース３２８は、生成されるべきメモリオブジェクトのための即時モード属性を、メモリオブジェクトのために即時モードがイネーブルにされるべきかどうかを指定する情報に基づいてメモリオブジェクトのために即時モードがイネーブルにされるべきかどうかを示す値に設定するように構成することができる。メモリオブジェクトの即時モード属性は、メモリオブジェクトをキャッシング不能な共有メモリとして及び／又はキャッシュコヒーレントな共有メモリとして実装すべかどうかを決定するために計算システム３１０によって用いることができる。
【０１６３】
メモリオブジェクト生成命令は、幾つかの例では、バッファオブジェクトのために即時モードがイネーブルにされるかどうかを指定する命令内の情報に基づいてバッファオブジェクトを生成するようにメモリバッファインタフェース３２８に命令するバッファオブジェクト生成命令を含むことができる。メモリオブジェクト生成命令は、さらなる例では、画像オブジェクトのために即時モードがイネーブルにされるかどうかを指定する命令内の情報に基づいて画像オブジェクトを生成するようにメモリバッファインタフェース３２８に命令する画像オブジェクト生成命令を含むことができる。
【０１６４】
幾つかの例では、バッファオブジェクト生成命令のためのインタフェースは、次の形態をとることができる。
【数６】
2013537993.tif 000008
【０１６５】
ここで、ｃｌＣｒｅａｔｅＢｕｆｆｅｒは、命令識別子であり、ｃｌ＿ｃｏｎｔｅｘｔ  ｃｏｎｔｅｘｔは、バッファオブジェクトを生成するために用いられる有効なコンテキスト、例えば、ＯｐｅｎＣＬコンテキストであり、ｃｌ＿ｍｅｍ＿ｆｌａｇｓ  ｆｌａｇｓは、バッファオブジェクトのための割り当て及び使用法情報を指定するために用いられるビットフィールドであり、ｓｉｚｅ＿ｔ  ｓｉｚｅは、割り当てられるべきバッファメモリオブジェクトのサイズをバイト単位で指定するパラメータであり、ｖｏｉｄ  *ｈｏｓｔ＿ｐｔｒは、アプリケーションによって割り当て済みであることができるバッファデータのポインタであり、ｃｌ＿ｉｎｔ  *ｅｒｒｃｏｄｅ＿ｒｅｔは、１つ以上のエラーコードを戻す。その命令は、生成されたバッファオブジェクトをｃｌ＿ｍｅｍメモリオブジェクトとして戻すことができる。この例では、画像オブジェクトのために即時モードがイネーブルにされるべきであるかどうかを指定する入力パラメータは、例えば、ｃｌ＿ｍｅｍ＿ｆｌａｇｓ  ｆｌａｇｓフィールドで指定されたＣＬ＿ＩＭＭＥＤＩＡＴＥフラグであることができる。
【０１６６】
さらなる例では、画像オブジェクト生成命令のためのインタフェースは、次の形態をとることができる。
【数７】
2013537993.tif 000009
【０１６７】
ここで、ｃｌＣｒｅａｔｅＩｍａｇｅ２Ｄは、命令識別子であり、ｃｌ＿ｃｏｎｔｅｘｔ  ｃｏｎｔｅｘｔは、バッファオブジェクトを生成するために用いられる有効なコンテキスト、例えば、ＯｐｅｎＣＬコンテキスト、であり、ｃｌ＿ｍｅｍ＿ｆｌａｇｓ  ｆｌａｇｓは、画像オブジェクトのための割り当て及び使用法情報を指定するために用いられるビットフィールドであり、ｃｏｎｓｔ  ｃｌ＿ｉｍａｇｅ＿ｆｏｒｍａｔ  *ｉｍａｇｅ＿ｆｏｒｍａｔは、割り当てられるべき画像のフォーマットプロパティを記述する構造のポインタであり、ｓｉｚｅ＿ｔ  ｉｍａｇｅ＿ｗｉｄｔｈは、ピクセルを単位とする画像の幅であり、ｓｉｚｅ＿ｔ  ｉｍａｇｅ＿ｈｅｉｇｈｔは、ピクセルを単位とする画像の高さであり、ｓｉｚｅ＿ｔ  ｉｍａｇｅ＿ｒｏｗ＿ｐｉｔｃｈは、バイトを単位とするスキャンラインのピッチであり、ｖｏｉｄ  *ｈｏｓｔ＿ｐｔｒは、アプリケーションによって割り当て済みであることができる画像データのポインタであり、ｃｌ＿ｉｎｔ  *ｅｒｒｃｏｄｅ＿ｒｅｔは、１つ以上のエラーコードを戻す。その命令は、生成された画像オブジェクトをｃｌ＿ｍｅｍメモリオブジェクトとして戻すことができる。この例では、画像オブジェクトのために即時モードがイネーブルにされるべきであるかどうかを指定する入力パラメータは、例えば、ｃｌ＿ｍｅｍ＿ｆｌａｇｓ  ｆｌａｇｓフィールドで指定されたＣＬ＿ＩＭＭＥＤＩＡＴＥフラグであることができる。
【０１６８】
幾つかの例では、メモリオブジェクト生成インタフェースは、読み取り／書き込み属性に関してＷＲＩＴＥ＿ＯＮＬＹ属性又はＲＥＡＤ＿ＯＮＬＹ属性のいずれかのみを許容するように構成することができる。換言すると、該例では、メモリバッファインタフェース３２８は、ＲＥＡＤ＿ＷＲＩＴＥ属性は拒否することができる。即時でないＣＬ画像は、ＯｐｅｎＣＬ仕様によって提供された該特徴を既に有していることができる。ＲＥＡＤ＿ＷＲＩＴＥ属性を拒否することは、キャッシュのコヒーレンシーを維持する上での複雑さを低減することができる。
【０１６９】
本開示により、メモリバッファインタフェース３２８は、ホストデバイス３１２及びＧＰＵ１４の両方によってアクセス可能である共有メモリスペース３３６のために即時モードがイネーブルにされるべきであるかどうかを指定する命令を受信するように、及び、共有メモリスペース３３６のために即時モードがイネーブルにされるべきであるかどうかを指定する受信された命令に基づいて共有メモリスペース３３６のために即時モードを選択的にイネーブルにように構成される。例えば、メモリバッファインタフェース３２８は、共有メモリスペース３３６のために即時モードがイネーブルにされるべきであることを命令が指定する場合は共有メモリスペース３３６のために即時モードをイネーブルにすることができ、共有メモリスペース３３６のために即時モードがディスエーブルにされるべきであることを命令が指定する場合は共有メモリスペース３３６のために即時モードをディスエーブルにすることができる。命令は、例えば、メモリオブジェクト生成命令、バッファオブジェクト生成命令又は画像オブジェクト生成命令のうちの１つであることができる。共有メモリスペース３３６は、例えば、メモリオブジェクト、バッファオブジェクト又は画像オブジェクトに対応することができる。
【０１７０】
幾つかの例では、メモリバッファインタフェース３２８が共有メモリスペース３３６のために即時モードをイネーブルしたときには、メモリバッファインタフェース３２８は、共有メモリスペース３３６のためのキャッシングサービスをディスエーブルにさせることができる。同様に、メモリバッファインタフェース３２８が共有メモリスペース３３６のために即時モードをディスエーブルにしたときには、メモリバッファインタフェース３２８は、共有メモリスペース３３６のためのキャッシングサービスを共有メモリスペース３３６のためにイネーブルにさせることができる。キャッシングサービスは、ホストキャッシュ３２４及びＧＰＵキャッシュ３３２のうちの１つ又は両方によって行うことができる。ここにおいて用いられる場合のキャッシングサービスとは、当業において知られるキャッシュによって典型的に行われるサービスを意味することができる。
【０１７１】
さらなる例では、メモリバッファインタフェース３２８は、共有メモリスペース３３６と関連付けられた即時モード属性を、共有メモリスペースのために即時モードがイネーブルにされるかどうかを示す値に設定することによって、共有メモリスペース３３６のために即時モードをイネーブル及びディスエーブルにすることができる。例えば、メモリバッファインタフェース３２８は、共有メモリスペース３３６と関連付けられた即時モード属性を、共有メモリスペース３３６のために即時モードがイネーブルにされること、例えば、即時モード属性＝真、を示す値に設定することによって、共有メモリスペース３３６のために即時モードをイネーブルにすることができる。同様に、メモリバッファインタフェース３２８は、共有メモリスペース３３６と関連付けられた即時モード属性を、共有メモリスペース３３６のために即時モードがディスエーブルにされること、例えば、即時モード属性＝偽、を示す値に設定することによって、共有メモリスペース３３６のために即時モードをディスエーブルにすることができる。即時モード属性は、幾つかの場合においては、ＧＰＵ３１４で実行中のタスク３３０によってアクセス可能であるグローバル変数、例えば、ブール変数、であることができる。幾つかの例では、即時モード属性は、共有メモリスペース３３６内に格納することができる。その他の例では、即時モード属性は、共有メモリスペース３３６以外のＧＰＵ３１４で実行中のタスク３３０によってアクセス可能な記憶場所内に格納することができる。共有メモリスペース３３６がメモリオブジェクトの一部である事例では、即時モード属性は、メモリオブジェクトのその他の属性が格納されるメモリスペースの記憶場所内に格納することができる。
【０１７２】
メモリバッファインタフェース３２８が共有メモリスペース３３６と関連付けられた即時モード属性を設定することによって共有メモリスペース３３６のために即時モードをイネーブル及びディスエーブルにする例では、タスク３３０のためのソースコードは、幾つかの事例では、共有メモリスペース３３６に関するメモリ読み取り又は書き込み動作を行う前に、タスク３３０が共有メモリスペース３３６と関連付けられた即時モード属性にアクセスし、共有メモリスペース３３６のための即時モード属性に基づいて共有メモリスペース３３６のために即時モードがイネーブルにされるかどうかを決定するような形でコンパイルすることができる。共有メモリスペース３３６のために即時モードがイネーブルにされる場合は、タスク３３０は、共有メモリスペース３３６からデータを読み取るための又は共有メモリスペース３３６にデータを書き込むための即時モード読み取り又は書き込み命令を実行するようにプログラミングすることができる。他方、共有メモリスペースのために即時モードがイネーブルにされない場合は、タスク３３０は、共有メモリスペース３３６からデータを読み取るための又は共有メモリスペース３３６にデータを書き込むためのキャッシュドモード読み取り又は書き込み命令、例えば、キャッシングされた読み取り又は書き込み命令、を実行するようにプログラミングすることができる
即時モード読み取り及び書き込み命令は、例えば、キャッシングサービスを使用せずに読み取り及び書き込み動作をそれぞれ行うことができる。例えば、即時モード読み取り命令は、読み取り動作を行う前にキャッシュを無効にさせることができ及び／又は読み取り動作を行うときにキャッシュをバイパスすることができる。即時モード書き込み命令は、例えば、書き込み動作を行うときに即時ライトバックをキャッシュに行わせることができ及び／又は書き込み動作を行うときにキャッシュをバイパスすることができる。キャッシングされた読み取り命令及び書き込み命令は、例えば、ＧＰＵキャッシュ３３２のうちの１つ又は両方のキャッシングサービスを用いて、読み取り及び書き込み動作をそれぞれ実行することができる。
【０１７３】
追加の事例では、タスク３３０のためのコンパイラは、タスク３３０のためのソースコードをコンパイルするときに、共有メモリスペース３３６のために即時モードがイネーブルにされるかどうかを示す情報へのアクセスを有することができる。例えば、タスク３３０のためのソースコード、例えば、カーネルソースコード、は、タスク３３０によって用いられ及び共有メモリスペース３３６と関連付けられたメモリオブジェクトのために即時モードがイネーブルにされるかどうかを示すフラグを含むことができる。幾つかの例では、フラグは、ＯｐｅｎＣＬ属性修飾子、例えば、＿ｃｌ＿ｉｍｍｅｄｉａｔｅ属性修飾子、の形態をとることができる。共有メモリスペース３３６と関連付けられたメモリオブジェクトのために即時モードがイネーブルにされる場合は、コンパイラは、タスク３３０のためのコンパイルされたコードが、共有メモリスペース３３６に関して生じる読み取り又は書き込み動作のための即時モード読み取り及び／又は書き込み命令を含むような形でタスク３３０をコンパイルすることができる。他方、共有メモリスペース３３６と関連付けられたメモリオブジェクトに関して即時モードがイネーブルにされない場合は、コンパイラは、タスク３３０のためのコンパイルされたコードが、共有メモリスペース３３６に関して生じる読み取り又は書き込み動作のための即時モード読み取り及び／又は書き込み命令を含まないような形でタスク３３０をコンパイルすることができる。例えば、コンパイラは、タスク３３０のためのコンパイルされたコードが、共有メモリスペース３３６に関して生じる読み取り又は書き込み動作のためのキャッシングされた読み取り及び／又は書き込み命令を含むような形でタスク３３０をコンパイルすることができる。
【０１７４】
さらなる例では、メモリバッファインタフェース３２８は、ホストデバイス３１２内のホストキャッシュ３２４及びＧＰＵ３１４内のＧＰＵキャッシュ３３２のうちの少なくとも１つによる共有メモリスペース３３６のためのキャッシングサービスの実施をイネーブル及びディスエーブルにすることによって共有メモリスペース３３６のために即時モードをイネーブル及びディスエーブルにすることができる。例えば、メモリバッファインタフェース３２８は、ホストデバイス３１２内のホストキャッシュ３２４及びＧＰＵ３１４内のＧＰＵキャッシュ３３２のうちの少なくとも１つによる共有メモリスペース３３６のためのキャッシングサービスの実施をディスエーブルにすることによって共有メモリスペース３３６のために即時モードをイネーブルにすることができる。同様に、メモリバッファインタフェース３２８は、ホストデバイス３１２内のホストキャッシュ３２４及びＧＰＵ３１４内のＧＰＵキャッシュ３３２のうちの少なくとも１つによる共有メモリスペース３３６のためのキャッシングサービスの実施をイネーブルにすることによって共有メモリスペース３３６のために即時モードをディスエーブルにすることができる。
【０１７５】
該例では、メモリバッファインタフェース３２８は、共有メモリスペース３３６のためのキャッシングサービスを行うキャッシュと関連付けられたハードウェアに基づくキャッシュ制御モジュール及び／又はハードウェアに基づくメモリ管理ユニットを構成することによって共有メモリスペース３３６のためのキャッシングサービスの実施をイネーブル及びディスエーブルにすることができる。例えば、ホストキャッシュ３２４による共有メモリスペース３３６のためのキャッシングサービスの実施をイネーブルにするためには、メモリバッファインタフェース３２８は、共有メモリスペース３３６のためにホストキャッシュ３２４によってキャッシングサービスが提供されるような形でホストキャッシュ制御モジュール３２６を構成することができる。ホストキャッシュ３２４による共有メモリスペース３３６のためのキャッシングサービスの実施をディスエーブルにするためには、メモリバッファインタフェース３２８は、例えば、共有メモリスペース３３６のためにホストキャッシュ３２４によってキャッシングサービスが提供されないような形でホストキャッシュ制御モジュール３２６を構成することができる。同様に、ＧＰＵキャッシュ３３２による共有メモリスペース３３６のためのキャッシングサービスの実施をイネーブルにするためには、メモリバッファインタフェース３２８は、例えば、共有メモリスペース３３６のためにホストキャッシュ３２４によってキャッシングサービスが提供されるような形でＧＰＵキャッシュ制御モジュール３３４を構成することができる。ＧＰＵキャッシュ３３２による共有メモリスペース３３６のためのキャッシングサービスの実施をディスエーブルにするためには、メモリバッファインタフェース３２８は、例えば、共有メモリスペース３３６のためにＧＰＵキャッシュ３３２によってキャッシングサービスが提供されないような形でＧＰＵキャッシュ制御モジュール３３４を構成することができる。
【０１７６】
幾つかの例では、メモリバッファインタフェース３２８は、共有メモリスペース３３６と関連付けられた１つ以上のハードウェアに基づく即時フラグを、共有メモリスペース３３６のためにキャッシングサービスが提供されるべきかどうかを示す値に設定することによって、ホストキャッシュ制御モジュール３２６及びＧＰＵキャッシュ制御モジュール３３４のうちの１つ又は両方を構成することができる。１つ以上のハードウェアに基づく即時フラグは、幾つかの例では、１つ以上のレジスタであることができる。さらなる例では、ハードウェアに基づく即時フラグは、即時フラグのテーブルの一部であることができ、即時フラグのテーブル内の各即時フラグは、メモリ３１６内の特定のアドレス空間に対応する。いずれの場合も、共有メモリスペース３３６と関連付けられた１つ以上の即時フラグが、キャッシングサービスが提供されるべきであることを示す値に設定されたときには、ホストキャッシュ制御モジュール３２６及び／又はＧＰＵキャッシュ制御モジュール３３４は、ホストキャッシュ３２４及び／又はＧＰＵキャッシュ３３２を用いて共有メモリスペース３３６のためのキャッシングサービスを提供することができる。同様に、共有メモリスペース３３６と関連付けられた１つ以上の即時フラグが、キャッシングサービスが提供されるべきでないことを示す値に設定されたときには、ホストキャッシュ制御モジュール３２６及び／又はＧＰＵキャッシュ制御モジュール３３４は、共有メモリスペース３３６のためのキャッシングサービスを提供することができない。
【０１７７】
該例では、ＧＰＵキャッシュ制御モジュール３３４は、メモリ３１６のアドレス空間内のメモリアドレスのための読み取り命令及び／又は書き込み命令を処理するように構成することができる。読み取り及び書き込み命令は、例えば、ＧＰＵ３１４で実行中のタスク３３０によってＧＰＵキャッシュ制御モジュール３３４に出すことができる。メモリ３１６の所定のアドレス空間内のメモリ記憶場所からデータを読み取る又はメモリ記憶場所にデータを書き込むための読み取り又は書き込み命令を受信したことに応答して、ＧＰＵキャッシュ制御モジュール３３４は、アドレス空間と関連付けられたハードウェアに基づくフラグを識別し、ハードウェアに基づくフラグの値に基づいて読み取り又は書き込み命令を処理するときにＧＰＵキャッシュ３３２のキャッシングサービスを使用するかどうかを決定することができる。ＧＰＵキャッシュ制御モジュール３３４がＧＰＵキャッシュ３３２のキャッシングサービスを使用することを決定した場合は、ＧＰＵキャッシュ制御モジュール３３４は、例えば、データが有効である場合にＧＰＵキャッシュ３３２からデータを読み取ること及び／又はＧＰＵキャッシュ３３２にデータを書き込むことを試行することができる。ＧＰＵキャッシュ制御モジュール３３４がＧＰＵキャッシュ３３２のキャッシングサービスを使用しないことを決定した場合は、ＧＰＵキャッシュ制御モジュール３３４は、幾つかの例では、ＧＰＵキャッシュ３３２をバイパスし、メモリ３１６から直接データを読み取ること又はメモリ３１６に直接データを書き込むことができる。追加の例では、ＧＰＵキャッシュ制御モジュール３３４がＧＰＵキャッシュ３３２のキャッシングサービスを使用しないことを決定した場合は、ＧＰＵキャッシュ制御モジュール３３４は、読み取り命令を実行する前にアドレス空間と関連付けられたキャッシュ３３２の部分を無効にすること及び／又は書き込み命令を実行するときにキャッシュライトバック（ｗｒｉｔｅ  ｂａｃｋ）又はキャッシュライトスルー（ｗｒｉｔｅ  ｔｈｒｏｕｇｈ）技法を実施することができる。ホストキャッシュ制御モジュール３３４は、ホストデバイス３１２で実行中のホストプロセス３２０から受信された読み取り及び書き込み命令に応答してホストキャッシュ３２４に関して同様の方法で動作することができる。
【０１７８】
追加の例では、メモリバッファインタフェース３２８は、ホストデバイス３１２内のホストキャッシュ３２４及びＧＰＵ３１４内のＧＰＵキャッシュ３３２のうちの少なくとも１つのために共有メモリキャッシュコヒーレンシーモードをイネーブル及びディスエーブルにすることによって共有メモリスペース３３６のために即時モードをイネーブル及びディスエーブルにすることができる。例えば、共有メモリスペース３３６のために即時モードをイネーブルにするめには、メモリバッファインタフェース３２８は、ホストデバイス３１２内のホストキャッシュ３２４及びＧＰＵ３１４内のＧＰＵキャッシュ３３２のうちの少なくとも１つのために共有メモリキャッシュコヒーレンシーモードをイネーブルにすることができる。同様に、共有メモリスペース３３６のために即時モードをディスエーブルにするためには、メモリバッファインタフェース３２８は、ホストデバイス３１２内のホストキャッシュ３２４及びＧＰＵ３１４内のＧＰＵキャッシュ３３２のうちの少なくとも１つのために共有メモリキャッシュコヒーレンシーモードをディスエーブルにすることができる。該例では、メモリバッファインタフェース３２８は、幾つかの事例では、共有メモリキャッシュコヒーレンシーモードをイネーブルにするようにホストキャッシュ制御モジュール３２６及びＧＰＵキャッシュ制御モジュール３３４のうちの１つ又は両方を構成することによってホストキャッシュ３２４のために共有メモリキャッシュコヒーレンシーモードをイネーブルにすることができ、共有メモリキャッシュコヒーレンシーモードをディスエーブルにするようにホストキャッシュ制御モジュール３２６及びＧＰＵキャッシュ制御モジュール３３４のうちの１つ又は両方を構成することによってホストキャッシュ３２４のために共有メモリキャッシュコヒーレンシーモードをディスエーブルにすることができる。
【０１７９】
ホストキャッシュ３２４のための共有メモリキャッシュコヒーレンシーモードがイネーブルにされたときには、ホストキャッシュ制御モジュール３２６は、既知の方法により共有メモリスペース３３６に関して共有メモリキャッシュコヒーレンシー技法を実行することができる。ホストキャッシュ３２４のための共有メモリキャッシュコヒーレンスモードがディスエーブルにされたときには、
ホストキャッシュ３２４は、共有メモリスペース３３６に関して共有メモリキャッシュコヒーレンシー技法を実行することができない。同様に、ＧＰＵキャッシュ３３２のための共有メモリキャッシュコヒーレンシーモードがイネーブルにされた時には、ＧＰＵキャッシュ制御モジュール３３４は、既知の方法により共有メモリスペース３３６に関して共有メモリキャッシュコヒーレンシー技法を実行することができる。ＧＰＵキャッシュ３３２のための共有メモリキャッシュコヒーレンスモードがディスエーブルにされたときには、ＧＰＵキャッシュ制御モジュール３３４は、共有メモリスペース３３６に関して共有メモリキャッシュコヒーレンシー技法を実行することができない。
【０１８０】
例示を容易にするため、図２０において例示された計算システム例３１０は、ＧＰＵ３１４を計算デバイスとして使用した本開示の即時バッファリング技法について説明する。本開示の技法は、ＧＰＵ３１４に加えて又はＧＰＵ３１４の代わりにＧＰＵ以外の計算デバイスを有するマルチプルプロセッサ計算システムに適用できることが認識されるべきである。幾つかの例では、計算システム３１０内の計算デバイスは、ＯｐｅｎＣＬ計算デバイスであることができる。さらに、図２０に示される計算システム例３１０は、ホストデバイスと計算デバイスとの間でのインフライトデータシェアリングを容易にする即時メモリオブジェクトを実装するためのインフラストラクチャ及び技法を例示する。しかしながら、その他の計算システム例では、それらの技法は、２つ以上の計算デバイスを有する計算システム内で異なる計算デバイス（例えば、ＯｐｅｎＣＬ計算デバイス）間でのインフライトデータシェアリングを提供するために容易に拡張することができる。該例では、異なる計算デバイス間で１本以上の割り込みラインを配線することができる。
【０１８１】
図２１は、本開示によるホストデバイスで実行中のプロセスによって出されたメモリオブジェクト生成命令を実行するための技法例を示した流れ図である。幾つかの例では、図２１に示される技法例を実装するために図２０の計算システム３１０を用いることができる。メモリオブジェクト生成命令は、バッファオブジェクト生成命令又は画像オブジェクト生成命令であることができる。メモリバッファインタフェース３２８は、メモリオブジェクト生成命令を受信する（３４０）。メモリバッファインタフェース３２８は、メモリオブジェクトのために即時モードがイネーブルにされるべきであることをメモリオブジェクト生成命令が指定するかどうかを決定する（３４２）。例えば、メモリバッファインタフェース３２８は、メモリオブジェクト生成命令用のパラメータリストに即時フラグパラメータが含まれるかどうかを決定することができる。
【０１８２】
メモリオブジェクトのために即時モードがイネーブルにされるべきであることをメモリオブジェクト生成命令が指定しないとメモリバッファインタフェース３２８が決定した場合は、メモリバッファインタフェース３２８は、生成されるべきメモリオブジェクトのための共有メモリスペース３３６を割り当て（３４４）、ホストキャッシュ３２４及びＧＰＵキャッシュ３３２のうちの１つ又は両方によるキャッシングサービスの実施を共有メモリスペース３３６のためにイネーブルにさせ（３４６）、生成されたメモリオブジェクトへの参照を戻すことができる（３４８）。メモリオブジェクト生成命令は、例えば、即時フラグパラメータを含めないことによって又は即時モードがイネーブルにされるべきでないことを他のパラメータ値で指定することによって即時モードがイネーブルにされるべきでないことを指定することができる。逆に、メモリオブジェクトのために即時モードがイネーブルにされるべきであることをメモリオブジェクト生成命令が指定するとメモリバッファインタフェース３２８が決定した場合は、メモリバッファインタフェース３２８は、生成されるべきメモリオブジェクトのための共有メモリスペース３３６を割り当て（３５０）、ホストキャッシュ３２４及びＧＰＵキャッシュ３３２のうちの１つ又は両方によるキャッシングサービスの実施を共有メモリスペース３３６のためにディスエーブルにさせ（３５２）、生成されたメモリオブジェクトへの参照を戻すことができる（３５４）。メモリオブジェクト生成命令は、例えば、即時フラグパラメータを含めることによって又は即時モードがイネーブルにされるべきであることを他のパラメータ値で指定することによって即時モードがイネーブルにされるべきであることを指定することができる。
【０１８３】
幾つかの例では、メモリバッファインタフェース３２８は、共有メモリスペース３３６と関連付けられたメモリオブジェクトの即時モード属性を、共有メモリスペース３３６と関連付けられたメモリオブジェクトのためにキャッシングサービスが提供されるべきであることを示す値に設定することによって、共有メモリスペース３３６のためにキャッシングサービスの実施をイネーブルにさせることができる。同様に、メモリバッファインタフェース３２８は、共有メモリスペース３３６と関連付けられたメモリオブジェクトの即時モード属性を、共有メモリスペース３３６と関連付けられたメモリオブジェクトのためにキャッシングサービスが提供されるべきでないことを示す値に設定することによって、共有メモリスペース３３６のためにキャッシングサービスの実施をディスエーブルにさせることができる。戻されたメモリオブジェクトは、即時モード属性を含むことができる。該例では、メモリオブジェクトのための即時モード属性は、ホストデバイス３１２で実行中のホストプロセス３２０及びＧＰＵ３１４で実行中のタスク３３０のうちの１つ又は両方によってアクセス可能であることができる。ホストプロセス３２０及び／又はタスク３３０は、共有メモリスペース３３６と関連付けられたメモリオブジェクトの即時モード属性に基づいて共有メモリスペース３３６に関して特定の読み取り及び書き込み命令を実行するときにキャッシングサービスを使用すべきかどうかを決定することができる。
【０１８４】
さらなる例では、メモリバッファインタフェース３２８は、共有メモリスペース３３６と関連付けられた１つ以上のハードウェアに基づく即時フラグを、共有メモリスペース３３６のためにキャッシングサービスが提供されるべきであることを示す値に設定することによって、共有メモリスペース３３６のためにキャッシングサービスの実施をイネーブルにさせることができる。同様に、メモリバッファインタフェース３２８は、共有メモリスペース３３６と関連付けられた１つ以上のハードウェアに基づく即時フラグを、共有メモリスペース３３６のためにキャッシングサービスが提供されるべきでないことを示す値に設定することによって、共有メモリスペース３３６のためにキャッシングサービスの実施をディスエーブルにさせることができる。１つ以上のハードウェアに基づく即時フラグは、ホストキャッシュ制御モジュール３２６及びＧＰＵキャッシュ制御モジュール３３４のうちの１つ以上に又は他のローカルな又はグローバルなメモリ管理ユニット（示されていない）に配置することができる。
【０１８５】
追加の例では、メモリバッファインタフェース３２８は、データを格納するためにメモリ３１６内の物理的メモリスペースを割り当てる前に、呼び出しを行っているプロセス、例えば、ホストプロセス３２０、にメモリオブジェクトを戻すことができる。該例では、メモリバッファインタフェース３２８は、戻されたメモリオブジェクト内に即時モード属性を含めることができる。メモリオブジェクトのためにのちにメモリ３１６が割り当てられるときには、メモリバッファインタフェース３２８又は他のモジュールは、メモリオブジェクトの即時モード属性に基づいて１つ以上のハードウェアに基づく即時フラグを設定することができる。
【０１８６】
図２２は、本開示によるホストデバイスで実行中のプロセスによって出されたメモリオブジェクト生成命令を実行するための他の技法例を示した流れ図である。幾つかの例では、図２２に示される技法例を実装するために図２０の計算システム３１０を用いることができる。メモリオブジェクト生成命令は、バッファオブジェクト生成命令又は画像オブジェクト生成命令であることができる。メモリバッファインタフェース３２８は、メモリオブジェクト生成命令を受信する（３５６）。メモリオブジェクトのために即時モードがイネーブルにされるべきであることをメモリオブジェクト生成命令が指定するかどうかを決定する（３５８）。例えば、メモリバッファインタフェース３２８は、メモリオブジェクト生成命令用のパラメータリストに即時フラグパラメータが含められるかどうかを決定することができる。
【０１８７】
メモリオブジェクトのために即時モードがイネーブルにされるべきであることをメモリオブジェクト生成命令が指定しないとメモリバッファインタフェース３２８が決定した場合は、メモリバッファインタフェース３２８は、生成されるべきメモリオブジェクトのための共有メモリスペース３３６を割り当て（３６０）、共有メモリスペース３３６のために共有メモリキャッシュコヒーレンシーモードをディスエーブルにし（３６２）、生成されたメモリオブジェクトへの参照を戻す（３６４）ことができる。逆に、メモリオブジェクトのために即時モードがイネーブルにされるべきであることをメモリオブジェクト生成命令が指定するとメモリバッファインタフェース３２８が決定した場合は、メモリバッファインタフェース３２８は、生成されるべきメモリオブジェクトのための共有メモリスペース３３６を割り当て（３６６）、共有メモリスペース３３６のために共有メモリキャッシュコヒーレンシーモードをイネーブルにし（３６８）、生成されたメモリオブジェクトへの参照を戻す（３７０）ことができる。
【０１８８】
幾つかの例では、メモリバッファインタフェース３２８は、データを格納するためにメモリ３１６内の物理的メモリスペースを割り当てる前に、呼び出しを行っているプロセス、例えば、ホストプロセス３２０、にメモリオブジェクトを戻すことができる。該例では、メモリバッファインタフェース３２８は、戻されたメモリオブジェクト内に即時モード属性を含めることができる。メモリオブジェクトのためにのちにメモリ３１６が割り当てられるときには、メモリバッファインタフェース３２８又は他のモジュールは、メモリオブジェクトの即時モード属性に基づいて共有メモリスペースキャッシュコヒーレンシーモードをイネーブル又はディスエーブルにすることができる。
【０１８９】
図２３乃至２８は、ＧＰＵが本開示による即時モード及びキャッシュドモードのロード命令及び格納命令を処理するために用いることができる技法例を示す。上述されるように、タスク３３０のためのソースコードは、幾つかの例では、即時メモリオブジェクト及びキャッシングされたメモリオブジェクトの両方をサポートするためにコンパイルされたコードがキャッシュドモード命令及び即時モード命令の両方を含むことができるような形でコンパイルすることができる。キャッシュドモード命令は、基礎になるメモリと関連付けられたキャッシュのキャッシングサービスを用いてメモリに関して読み取り及び書き込み動作を実行することができ、即時モード命令は、基礎になるメモリと関連付けられたキャッシュのキャッシングサービスを用いずにメモリに関して読み取り及び書き込み動作を実行することができる。キャッシュドモード命令は、ここでは代替として非即時モード命令と呼ぶことができる。ロード及び格納命令は、ここでは代替として読み取り及び書き込み命令とそれぞれ呼ぶことができる。
【０１９０】
幾つかの例では、ロード又は格納命令のキャッシュドモードバージョン及びロード又は格納命令の即時モードバージョンは、例えば、各々が異なる演算コード、すなわちオプコード、を有する異なる命令であることができる。さらなる例では、ロード又は格納命令のキャッシュドモードバージョン及びロード又は格納命令の即時モードバージョンは、例えば、両方が同じオプコードを有する同じ命令であることができる。該例では、命令とともに提供されるパラメータは、命令がキャッシュドモードであるか又は即時モードであるかを指定することができる。
【０１９１】
図２３は、本開示によるキャッシュドモード及び即時モード命令を処理するための技法例を示す流れ図である。幾つかの例では、図２３に示される技法例を実装するために図２０の計算システム３１０を用いることができる。図２３の例では、即時モードは、バイパスキャッシュモードと呼ばれ、即時モード命令は、バイパスキャッシュモード命令に対応する。ＧＰＵキャッシュ制御モジュール３３４は、メモリ記憶場所及びバイパスキャッシュモードがイネーブルにされるかどうかを指定するロード命令を受信する（３７２）。ＧＰＵキャッシュ制御モジュール３３４は、バイパスキャッシュモードがイネーブルにされるようにロード命令が指定するかどうかを決定する（３７４）。幾つかの事例では、ＧＰＵキャッシュ制御モジュール３３４は、命令のタイプ、例えば、命令のオプコード、に基づいてバイパスキャッシュモードがイネーブルにされるようにロード命令が指定するかどうかを決定することができる。追加の事例では、ＧＰＵキャッシュ制御モジュール３３４は、ロード命令とともに含まれておりバイパスキャッシュモードがイネーブルにされるかどうかを示すパラメータに基づいてバイパスキャッシュモードがイネーブルにされるようにロード命令が指定するかどうかを決定することができる。バイパスキャッシュモードがイネーブルにされないとＧＰＵキャッシュ制御モジュール３３４が決定した場合は、ＧＰＵキャッシュ制御モジュール３３４は、ロード命令において指定されたメモリ記憶場所と関連付けられたキャッシュ記憶場所において、キャッシュ、例えば、ＧＰＵキャッシュ３３２、からデータを取り出す（３７６）。他方、バイパスキャッシュモードがイネーブルにされるとＧＰＵキャッシュ制御モジュール３３４が決定した場合は、ＧＰＵキャッシュ制御モジュール３３４は、ロード命令において指定されたメモリ記憶場所において、メモリ、例えば、共有メモリスペース３３６、からデータを取り出す（３７８）。
【０１９２】
図２４は、本開示によるキャッシュドモード命令及び即時モード命令を処理するための他の技法例を示した流れ図である。幾つかの例では、図２４に示される技法例を実装するために図２０の計算システム３１０を用いることができる。図２４の例では、即時モードは、バイパスキャッシュモードと呼ばれ、即時モード命令は、バイパスキャッシュモード命令に対応する。ＧＰＵキャッシュ制御モジュール３３４は、メモリ記憶場所、格納すべきデータ及びバイパスキャッシュモードがイネーブルにされるかどうかを指定する格納命令を受信する（３８０）。ＧＰＵキャッシュ制御モジュール３３４は、バイパスキャッシュモードがイネーブルにされるように格納命令が指定するかどうかを決定する（３８２）。幾つかの事例では、ＧＰＵキャッシュ制御モジュール３３４は、命令のタイプ、例えば、命令のオプコード、に基づいてバイパスキャッシュモードがイネーブルにされるように格納命令が指定するかどうかを決定することができる。追加の事例では、ＧＰＵキャッシュ制御モジュール３３４は、ロード命令とともに含まれておりバイパスキャッシュモードがイネーブルにされるかどうかを示すパラメータに基づいてバイパスキャッシュモードがイネーブルにされるように格納命令が指定するかどうかを決定することができる。バイパスキャッシュモードがイネーブルにされないとＧＰＵキャッシュ制御モジュール３３４が決定した場合は、ＧＰＵキャッシュ制御モジュール３３４は、格納命令において指定されたメモリ記憶場所と関連付けられたキャッシュ記憶場所において、キャッシュ、例えば、ＧＰＵキャッシュ３３２に、格納命令内で指定されたデータを格納する（３８４）。他方、バイパスキャッシュモードがイネーブルにされるとＧＰＵキャッシュ制御モジュール３３４が決定した場合は、ＧＰＵキャッシュ制御モジュール３３４は、格納命令において指定されたメモリ記憶場所において、メモリ、例えば、共有メモリスペース３３６、に格納命令内で指定されたデータを格納する（３８６）。
【０１９３】
図２５は、本開示によるキャッシュドモード命令及び即時モード命令を処理するための他の技法例を示した流れ図である。幾つかの例では、図２５に示される技法例を実装するために図２０の計算システム３１０を用いることができる。ＧＰＵキャッシュ制御モジュール３３４は、メモリ記憶場所、格納すべきデータ及び即時モードがイネーブルにされるかどうかを指定する格納命令を受信する。ＧＰＵキャッシュ制御モジュール３３４は、格納命令内で指定されたメモリ記憶場所と関連付けられたキャッシュ記憶場所において、キャッシュ、例えば、ＧＰＵキャッシュ３３２、に格納命令内で指定されたデータを格納する（３９０）。ＧＰＵキャッシュ制御モジュール３３４は、即時モードがイネーブルにされるかどうかを指定する格納命令内の情報に基づいて即時モードがイネーブルにされるかどうかを決定する（３９２）。即時モードがイネーブルにされるかどうかを指定する情報は、幾つかの例では、命令のタイプ、例えば、命令のためのオプコード、及び／又は命令に関して即時モードがイネーブルにされるかどうかを指定する命令とともに含まれているパラメータであることができる。即時モードがイネーブルにされない場合は、ＧＰＵキャッシュ制御モジュール３３４は、即時のキャッシュライトバック動作を行わない（３９４）。他方、即時モードがイネーブルにされる場合は、ＧＰＵキャッシュ制御モジュール３３４は、即時のキャッシュライトバック動作を行う（３９６）。
【０１９４】
図２６は、本開示によるキャッシュドモード及び即時モード命令を処理するための他の技法例を示す流れ図である。幾つかの例では、図２６に示される技法例を実装するために図２０の計算システム３１０を用いることができる。ＧＰＵキャッシュ制御モジュール３３４は、メモリ記憶場所及び即時モードがイネーブルにされるかどうかを指定するロード命令を受信する（３９８）。ＧＰＵキャッシュ制御モジュール３３４は、即時モードがイネーブルにされるかどうかを指定するロード命令内の情報に基づいて即時モードがイネーブルにされるかどうかを決定する（４００）。即時モードがイネーブルにされるかどうかを指定する情報は、幾つかの例では、命令のタイプ、例えば、命令のためのオプコード、及び／又は命令とともに含まれており、命令に関して即時モードがイネーブルにされるかどうかを指定するパラメータであることができる。即時モードがイネーブルにされない場合は、ＧＰＵキャッシュ制御モジュール３３４は、キャッシュをフラッシング（ｆｌｕｓｈｉｎｇ）して無効にしない（４０２）。ＧＰＵキャッシュ制御モジュール３３４は、ロード命令内で指定されたデータを、キャッシュ、例えば、ＧＰＵキャッシュ３３２、内で入手可能な場合はキャッシュから、又は、キャッシュ内でデータを入手可能でない場合は、基礎となるメモリから、データを取り出す（４０４）。即時モードがイネーブルにされる場合は、ＧＰＵキャッシュ制御モジュール３３４は、キャッシュをフラッシングして無効化する（４０６）。ＧＰＵキャッシュ制御モジュール３３４は、ロード命令内で指定されたデータを基礎となるメモリから取り出す（４０８）。キャッシュは、フラッシングされて無効化されているためデータを戻さない。
【０１９５】
図２７は、本開示による図２０の計算システム３１０において用いることができるＧＰＵ例４２０を示したブロック図である。幾つかの例では、図２０に例示されるＧＰＵ３１４を実装するためにＧＰＵ４２０を用いることができる。ＧＰＵ４２０は、ＧＰＵ処理モジュール４２２と、ＧＰＵキャッシュ制御モジュール４２４と、ＧＰＵキャッシュ４２６と、キャッシュバス４２８と、バイパスバス４３０と、を含む。ＧＰＵ処理モジュール４２２は、キャッシュバス４２８を介してＧＰＵキャッシュ制御モジュール４２４に通信可能な形で結合される。ＧＰＵ処理モジュール４２２は、バイパスバス４３０を介してメモリ３１６にも通信可能な形で結合される。ＧＰＵキャッシュ制御モジュール４２４及びＧＰＵキャッシュ４２６は、図２０のＧＰＵキャッシュ制御モジュール３３４及びＧＰＵキャッシュ３３２と実質的に類似しており、さらに詳細には説明されない。ＧＰＵ処理モジュール４２２は、処理素子４３２と、バスコントローラ４３４と、を含む。処理素子４３２は、バスコントローラ４３４にロード及び格納命令を出すように構成される。
【０１９６】
バスコントローラ４３４は、キャッシュバス４２８及びバイパスパス４３０を介して該当する記憶場所にロード及び格納命令を転送するように構成することができる。バスコントローラ４３４は、命令が即時モード命令であるか又はキャッシュドモード命令であるかを示すロード命令又は格納命令内の情報に基づいて即時モード又は非即時モードで動作するように構成することができる。バスコントローラ４３４が非即時モード、すなわち、キャッシュドモード、で動作するように構成されるときには、バスコントローラ４３４は、実行のためにＧＰＵキャッシュ制御モジュール４２４にロード及び格納命令を転送するためにキャッシュバス４２８を用いることができる。他方、バスコントローラ４３４が即時モードで動作するように構成されるときには、バスコントローラ４３４は、実行のためにメモリ３１６にロード及び格納命令を転送するためにバイパスバス４３０を用いることができる。
【０１９７】
図２８は、本開示によるキャッシュドモード命令及び即時モード命令を処理するための技法例を示した流れ図である。幾つかの例では、図２８に示される技法例を実装するために図２７のＧＰＵ４２０を用いることができる。バスコントローラ４３４は、ロード又は格納命令を受信する（４４０）。バスコントローラ４３４は、即時モードがイネーブルにされるかどうかを指定するロード又は格納命令内の情報に基づいて即時モードがイネーブルにされるかどうかを決定する（４４２）。即時モードがイネーブルにされるかどうかを指定する情報は、幾つかの例では、命令のタイプ、例えば、命令のためのオプコード、及び／又は命令に関して即時モードがイネーブルにされるかどうかを指定する、命令とともに含まれているパラメータであることができる。即時モードがイネーブルにされないとバスコントローラ４３４が決定した場合は、バスコントローラ４３４は、ＧＰＵキャッシュ制御モジュール４２４に受信された命令を転送するためにキャッシュバス４２８を使用する（４４４）。そうでない場合、即時モードがイネーブルにされるとバスコントローラ４３４が決定した場合は、バスコントローラ４３４は、メモリ３１６に受信された命令を転送するためにバイパスバス４３０を使用する（４４６）。
【０１９８】
図２９は、本開示によるホストデバイスで実行中のプロセスによって出されたメモリオブジェクト生成命令を実行するための他の技法例を示した流れ図である。幾つかの例では、図２９に示される技法例を実装するために図２０の計算システム３１０を用いることができる。メモリオブジェクト生成命令は、バッファオブジェクト生成命令又は画像オブジェクト生成命令であることができる。メモリバッファインタフェース３２８がメモリオブジェクト生成命令を受信する（４４８）。メモリバッファインタフェース３２８は、メモリオブジェクトのために即時モードがイネーブルにされるべきかどうかをメモリオブジェクト生成命令が指定するかどうかを決定する（４５０）。例えば、メモリバッファインタフェース３２８は、メモリオブジェクト生成命令用のパラメータリストに即時フラグパラメータが含められているかどうかを決定することができる。
【０１９９】
メモリオブジェクトのために即時モードがイネーブルにされるべきであることをメモリオブジェクト生成命令が指定しないとメモリバッファインタフェース３２８が決定した場合は、メモリバッファインタフェース３２８は、生成されたメモリオブジェクトのための即時モード属性を、即時モードがイネーブルにされない、例えば、“偽”、であることを示す値に設定する（４５２）。他方、メモリオブジェクトのために即時モードがイネーブルにされるべきであることをメモリオブジェクト生成命令が指定するとメモリバッファインタフェース３２８が決定した場合は、メモリバッファインタフェース３２８は、生成されたメモリオブジェクトのための即時モード属性を、即時モードがイネーブルにされる、例えば、“真”、であることを示す値に設定する（４５４）。メモリオブジェクトの即時モード属性は、幾つかの例では、特定のメモリオブジェクトに格納されたデータにアクセスするときにキャッシュドモード読み取り及び書き込み動作又は即時モード読み取り及び書き込み動作を実行すべきかどうかを決定するために、ホストデバイス３１２及び／又はＧＰＵ３１４によって用いることができる。
【０２００】
幾つかの例では、ホストプロセス３２０及び／又はタスク３３０は、幾つかのメモリオブジェクトが即時メモリオブジェクトであるように及びその他のオブジェクトがキャッシングされたメモリオブジェクト、すなわち、非即時メモリオブジェクト、であるようにプログラミングすることを希望することができる。本開示の技法は、幾つかの例では、コンパイルされたタスク３３０がキャッシングされたメモリオブジェクト及び即時メモリオブジェクトの両方に関する読み取り及び書き込み動作を行うのを可能にする専門化されたコンパイル技法を含むことができる。第１のコンパイル技法例は、所定の読み取り動作又は書き込み動作をコンパイルして命令のシーケンスにすることができる。命令のシーケンスは、読み取られる又は書き込まれるメモリオブジェクトのための即時モード属性の値を検査し、即時モード属性の値に基づいてキャッシュドモード命令又は即時モード命令のいずれを実行するかを決定することができる。第２のコンパイル技法例は、メモリオブジェクトにアクセスするためにコンパイルされたコード内で使用するキャッシュモード命令又は即時モード命令のいずれかを選択するためにメモリオブジェクトが即時モードオブジェクトであるかどうかを示すソースコード内の情報を用いることができる。
【０２０１】
第１のコンパイル技法例により、コンパイラは、タスク３３０のためのコンパイルされたコードが次の擬似コード例による読み取りシーケンスを含むような形でタスク３３０のためのソースコードをコンパイルすることができる。
【数８】
2013537993.tif 000010
【０２０２】
ここで、“ｉｓＩｍｍｅｄｉａｔｅ”は、データが読み取られるメモリオブジェクトのためのブール即時モード属性を表し、“ｉｍｍｅｄｉａｔｅ＿ｒｅａｄ（．．．）”は、即時モード読み取り命令を表し、“ｃａｃｈｅｄ＿ｒｅａｄ（．．．）”は、キャッシュドモード読み取り命令を表す。
【０２０３】
ＧＰＵキャッシュ制御モジュール３３４は、使用されている場合は、ＧＰＵキャッシュ３３２からデータを読み取る前に、例えば、ＧＰＵキャッシュ３３２を無効化することによってｉｍｍｅｄｉａｔｅ＿ｒｅａｄ（．．．）命令を処理することができる。ＧＰＵキャッシュ制御モジュール３３４は、例えば、読み取りを行う前にＧＰＵキャッシュ３３２を無効化することなしに、通常の方法でＧＰＵキャッシュからデータを読み取ることによってｃａｃｈｅｄ＿ｒｅａｄ（．．．）命令を処理することができる。
【０２０４】
第１のコンパイル技法例により、コンパイラは、タスク３３０のためのコンパイルされたコードが次の擬似コード例による書き込みシーケンスを含むような形でタスク３３０のためのソースコードをコンパイルすることができる。
【数９】
2013537993.tif 000011
【０２０５】
ここで、“ｉｓＩｍｍｅｄｉａｔｅ”は、データが書き込まれるメモリオブジェクトのためのブール即時モード属性を表し、“ｉｍｍｅｄｉａｔｅ＿ｗｒｉｔｅ（．．．）”は、即時モード書き込み命令を表し、“ｃａｃｈｅｄ＿ｗｒｉｔｅ（．．．）”は、キャッシュドモード書き込み命令を表す。
【０２０６】
ＧＰＵキャッシュ制御モジュール３３４は、幾つかの例では、キャッシュが用いられる場合は、ＧＰＵキャッシュ３３２のためにライトスルーモードを用いることによって、ｉｍｍｅｄｉａｔｅ＿ｗｒｉｔｅ（．．．）命令を処理することができる。さらなる例では、ＧＰＵキャッシュ制御モジュール３３４は、キャッシュが用いられる場合は、ＧＰＵキャッシュ３３２にデータを書き込み、ＧＰＵキャッシュ３３２にデータを書き込むことに応答してＧＰＵキャッシュ３３２のためのキャッシュフラッシュを行うことによってｉｍｍｅｄｉａｔｅ＿ｗｒｉｔｅ（．．．）命令を処理することができる。ＧＰＵキャッシュ制御モジュール３３４は、例えば、ライトスルーモードを使用せずに及び／又は書き込み動作に応答してキャッシュをフラッシングすることなしに通常の方法でＧＰＵキャッシュ３３２にデータを書き込むことによってｃａｃｈｅｄ＿ｗｒｉｔｅ（．．．）命令を処理することができる。
【０２０７】
図３０は、ＧＰＵが上記の第１のコンパイル技法によりコンパイルされた命令のシーケンスをどのようにして処理することができるかを例示した流れ図である。幾つかの例では、図３０に例示された技法は、読み取り及び書き込みシーケンスのために上記において提供された擬似コード例を実装するために用いることができる。タスク３３０は、読み取りシーケンス又は書き込みシーケンスを開始する（４５６）。例えば、タスク３３０は、タスク３３０が、タスク３３０の実行の際に特定のメモリオブジェクトのための読み取り又は書き込み命令が発生すべきである時点に達したときに読み取りシーケンス又は書き込みシーケンスを開始することができる。タスク３３０は、データが読み取られる又はデータが書き込まれるメモリオブジェクトと関連付けられた即時モード属性にアクセスする（４５８）。タスク３３０は、メモリオブジェクトのための属性が、即時モードがイネーブルにされることを示す値、例えば、“真”、に設定されているかどうかを決定する。メモリオブジェクトのための属性が、即時モードがイネーブルにされないことを示す値に設定されているとタスク３３０が決定した場合は、タスク３３０は、キャッシングされた読み取り又は書き込み命令を用いてメモリオブジェクトのためのキャッシングされた読み取り動作又は書き込み動作を行う（４６２）。そうでない場合、メモリオブジェクトのための属性が、即時モードがイネーブルにされることを示す値に設定されているとタスク３３０が決定した場合は、タスク３３０は、即時の読み取り又は書き込み命令を用いてメモリオブジェクトのための即時の読み取り又は書き込み動作を行う（４６４）。
【０２０８】
第２のコンパイル技法例により、ソースコードをコンパイルするときに、コンパイラは、タスク３３０によって読み取られる又は書き込まれる特定のメモリオブジェクトのために即時モードがイネーブルにされるかどうかを示す情報へのアクセスを有することができる。コンパイラは、タスク３３０が特定のメモリオブジェクトから読み取る又は特定のメモリオブジェクトに書き込むときにキャッシュドモード読み取り及び書き込み命令又は即時モード読み取り及び書き込み命令の間でタスク３３０が選択するためにソースコードをコンパイルするためにこの情報を用いることができる。
【０２０９】
幾つかの例では、特定のメモリオブジェクトのために即時モードがイネーブルにされるかどうかを示す情報は、タスク３３０のためのソースコードによってアクセスされた１つ以上のメモリオブジェクトのために即時モードがイネーブルにされるかどうかを示すコンパイル時間属性であることができる。例えば、タスク３３０のためのソースコード、例えば、カーネルソースコード、は、タスク３３０によって用いられる１つ以上のメモリオブジェクトのために即時モードがイネーブルにされるかどうかを示すコンパイル時間属性を含むことができる。コンパイル時間属性は、幾つかの事例では、ＯｐｅｎＣＬ属性修飾子、例えば、＿ｃｌ＿ｉｍｍｅｄｉａｔｅ、の形態をとることができる。属性修飾子は、１つ以上の特定のメモリオブジェクト及び／又は１つ以上のメモリオブジェクト内に格納される１つ以上の変数と関連付けることができる。属性修飾子が特定のメモリオブジェクトと関連付けられるときには、コンパイラは、メモリオブジェクトのために即時モードがイネーブルにされると決定することができる。同様に、属性修飾子が特定のメモリオブジェクトと関連付けられないときには、コンパイラは、メモリオブジェクトのために即時モードがイネーブルにされないと決定することができる。該属性を用いることは、コンパイラにとっての作業を軽減し、潜在的にカーネルのサイズを小さくすることができる。幾つかの例では、ソフトウェアアプリケーションは、即時バッファの使用を、該バッファが必要とされる事例に制限することができる。該例では、即時バッファを使用すべきかどうかの判断は、コンパイル時間判断であることができる。
【０２１０】
共有メモリスペース３３６と関連付けられたメモリオブジェクトのために即時モードがイネーブルにされることをコンパイル時間属性が示す場合は、コンパイラは、タスク３３０のためのコンパイルされたコードが共有メモリスペース３３６に関して生じる読み取り又は書き込み動作のための即時モード読み取り及び／又は書き込み命令を含むような形でタスク３３０をコンパイルすることができる。そうでない場合、共有メモリスペース３３６と関連付けられたメモリオブジェクトのために即時モードがイネーブルにされない場合は、コンパイラは、タスク３３０のためのコンパイルされたコードが共有メモリスペース３３６に関して生じる読み取り又は書き込み動作のための即時モード読み取り及び／又は書き込み命令を含まないような形でタスク３３０をコンパイルことができる。例えば、コンパイラは、タスク３３０のためのコンパイルされたコードが共有メモリスペース３３６に関して生じる読み取り又は書き込み動作のためのキャッシングされた読み取り及び／又は書き込み命令を含むような形でタスク３３０をコンパイルことができる。
【０２１１】
図３１は、本開示によるタスクのためのソースコードをコンパイルするための技法例を示した流れ図である。図３１の技法を用いてコンパイルされた結果得られたコードは、幾つかの例では、図２０のタスク３３０に対応することができる。図３１の技法例では、タスク３３０は、カーネルと呼ばれる。コンパイラは、メモリオブジェクトによって実装されるカーネル引数を処理する（４６６）。コンパイラは、メモリオブジェクトが即時モードメモリオブジェクトであるかどうかを決定する（４６８）。幾つかの例では、コンパイラは、カーネルのソースコードに含まれる情報、例えば、カーネル引数と関連付けられたコンパイル時間属性、に基づいてメモリオブジェクトが即時モードメモリオブジェクトであるかどうかを決定することができる。メモリオブジェクトが即時モードメモリオブジェクトでないとコンパイラが決定した場合は、コンパイラは、キャッシングされた読み取り及び書き込み命令を用いて特定のカーネル引数と関連付けられた読み取り動作及び書き込み動作をコンパイルする（４７０）。他方、メモリオブジェクトが即時モードメモリオブジェクトであるとコンパイラが決定した場合は、コンパイラは、即時モード読み取り及び書き込み命令を用いて特定のカーネル引数と関連付けられた読み取り動作及び書き込み動作をコンパイルする（４７２）。
【０２１２】
図３２は、本開示によるキャッシングサービスを選択的に使用するためにＧＰＵによって用いることができる技法例を示した流れ図である。例えば、それらの技法は、メモリのメモリスペースに関して読み取り動作及び書き込み動作のうちの少なくとも１つを実行するためにキャッシングサービスが使用されるべきであるかを指定する情報を受信したことに応答してメモリスペースに関して読み取り動作又は書き込み動作のうちの少なくとも１つを実行するためにメモリと関連付けられたＧＰＵキャッシュをＧＰＵが選択的に使用するのを可能にすることができる。幾つかの例では、図３２において例示された技法を実装するために図２０において例示されたＧＰＵ３１４及び／又は図２７において例示されたＧＰＵ４２０を用いることができる。
【０２１３】
ＧＰＵ３１４が、処理するために読み取り命令又は書き込み命令のうちの少なくとも１つを受信する（４７４）。受信された命令は、メモリのメモリスペースに関して読み取り動作及び書き込み動作のうちの少なくとも１つを実行するようにＧＰＵ３１４に命令することができる。ＧＰＵ３１４は、メモリスペースに関して読み取り動作及び書き込み動作のうちの少なくとも１つを実行するためにキャッシングサービスが使用されるべきかどうかを指定するキャッシュモード情報を受信する（４７６）。幾つかの例では、キャッシュモード情報は、受信された命令内に含めることができる。さらなる例では、キャッシュモード情報は、メモリスペースと関連付けられたメモリオブジェクトの即時モード属性であることができる。ＧＰＵ３１４は、キャッシュモード情報に基づいてキャッシングサービスを使用すべきかどうかを決定する（４７８）。受信された命令を実行するためにキャッシングサービスが使用されるべきであることを指定する情報を受信したことに応答して、ＧＰＵ３１４は、受信された命令を実行するためにキャッシングサービスを使用することができる（４８０）。受信された命令を実行するためにキャッシングサービスが使用されるべきでないことを指定する情報を受信したことに応答して、ＧＰＵ３１４は、受信された命令を実行するためにキャッシングサービスを使用することができない（４８２）。幾つかの例では、ＧＰＵ３１４は、判断ボックス４７８及びプロセスボックス４８０及び４８２のうちの１つ以上を実装するために図２３乃至２８及び３０に例示された技法のうちの１つ以上を用いることができる。幾つかの事例では、図３２に示される技法を実装するためにＧＰＵキャッシュ制御モジュール又はメモリ管理ユニット、例えば、図２０において例示されたＧＰＵキャッシュ制御モジュール３３４、を用いることができる。追加の事例では、図３２に示される技法を実装するためにバスコントローラ、例えば、図２７において例示されたバスコントローラ４３４、を用いることができる。
【０２１４】
幾つかの例では、即時メモリオブジェクトを実装するために、ＧＰＵ  ＡＬＵはグローバルメモリキャッシュ及び／又はＡＬＵ命令内で指定されたグローバルメモリキャッシュの特定の部分を無効にするＡＬＵ命令を実行するように設計することができる。概して、ホストデバイス３１２は、即時メモリオブジェクトを実装するために既存のＣＰＵ能力を用いることができる。
【０２１５】
今度は、本開示において説明されるアウトオブバンドシグナリング技法、例えば、ここにおいて説明されるメッセージ渡し技法、及び本開示において説明される即時メモリオブジェクトに関する様々な使用事例がさらに詳細に説明される。第１の使用事例により、アウトオブバンドシグナリングは、アウトオブバンドシグナリング技法に加えて即時メモリオブジェクトを必ずしも使用せずに独立型の機能として用いることができる。アウトオブバンドシグナリングは、
同期化のため及び相対的に少量のデータを素早く渡すために用いることができる。幾つかの例では、アウトオブバンドシグナリングは、即時メモリオブジェクトよりも低いレーテンシーを有することができるが、即時メモリオブジェクトよりも低い帯域幅を有することができる。
【０２１６】
アウトオブバンドシグナリングは、メモリ割り当て動作のために第１の使用事例により用いることもできる。例えば、ＧＰＵは、ホストＣＰＵが新しいバッファを割り当てるように要求するためにアウトオブバンドシグナリングを用いることができる。ＧＰＵは、要求されたバッファ長をホストＣＰＵに指定するためにアウトオブバンドシグナリングを用いることもできる。他の例として、ＣＰＵは、バッファのためのメモリ記憶場所を指定するポインタをＧＰＵに送信するためのバッファを割り当てた後にアウトオブバンドシグナリングを用いることができる。
【０２１７】
アウトオブバンドシグナリングは、少量のデータがやり取りされることになるリモートプロシージャコールのために第１の使用事例により用いることもできる。例えば、計算デバイス内の計算ユニットで実行中のカーネルが同じ計算デバイス又は他の計算デバイス内の他の計算ユニットで他のカーネルを起動させるためにＲＰＣを用いる事例においては、ＲＰＣのためのデータは、起動を行う計算ユニットのローカルメモリに格納することができる。本開示のアウトオブバンドシグナリング技法は、起動を行う計算ユニットのローカルメモリから新しく起動されたカーネルを実行する計算ユニットのローカルメモリにデータを転送するために用いることができる。
【０２１８】
アウトオブバンドシグナリングは、進行状況の報告のために第１の事例により用いることもできる。例えば、ＧＰＵは、現在のタスクの完了率をホストＣＰＵに報告するためにアウトオブバンドシグナリングを用いることができる。
【０２１９】
アウトオブバンドシグナリングは、エラー報告のために第１の使用事例により用いることもできる。例えば、ＧＰＵは、ホストＣＰＵにエラーコードを報告するためにアウトオブバンドシグナリングを用いることができる。
【０２２０】
アウトオブバンドシグナリングは、コンテキストスイッチを援助するために第１の使用事例により用いることもできる。例えば、ホストＣＰＵは、ＧＰＵがコンテキストスイッチのために準備するために状態を保存するように要求するためにアウトオブバンドシグナリングを用いることができる。
【０２２１】
第２の使用事例により、即時メモリオブジェクトは、即時メモリオブジェクトに加えてアウトオブバンドシグナリングを必ずしも使用せずに独立型機能として用いることができる。例えば、即時バッファは、相対的に大量のデータのやり取りを達成させるために用いることができる。即時バッファは、データだけでなく、同期化マーカも入れることができる。この場合は、データ生成器は、最初にバッファにデータを書き込み、次に、データが準備完了であること及び／又は記憶場所をコンシューマ（ｃｏｎｓｕｍｅｒ）に示す同期化マーカを書き込むことができる。コンシューマは、推測で決定された記憶場所をポーリングすることによって、このメモリ記憶場所、例えば、バッファの見出し部、内の同期化データを探す。同期化マーカが入手された時点で、コンシューマはデータを読み取る。同様の技法を即時画像オブジェクトに対して適用することができる。
【０２２２】
これらの技法のために様々な同期化プロトコルを採用することができる。例えば、同期化マーカをデータバッファ内部に埋め込むことができ、又は、別個のバッファに配置することができる。該技法は、可変長符号化又はラン長符号化方式を用いて圧縮される圧縮されたデータの送信に適用することができる。
【０２２３】
第３の事例により、例えば、相対的に大量のデータのやり取りを達成させるために即時メモリオブジェクトをアウトオブバンドシグナリングとともに用いることができる。この場合は、アウトオブバンドシグナリングは、即時メモリオブジェクトがデータを格納する間に同期化のために用いることができる。例えば、データ生成器は、即時バッファ内にデータを入れ、アウトオブバンドシグナリングを用いてデータの準備完了及び記憶場所及び／又はサイズをコンシューマに通知することができる。流れが制御されたシナリオにおいては、コンシューマは、データを読み取り、バッファを再使用可能であることを生成器に通知する。同通知は、アウトオブバンドシグナリングを用いて達成させることもできる。
【０２２４】
該技法は、流れが制御されたデータパイプライニングを要求するアルゴリズムにおいて用いることができる。ホストＣＰＵ及びＧＰＵに関しては、該技法は、例えば、診断ロギングのために用いることができる。複数のＯｐｅｎＣＬデバイスに関しては、これらの技法は、非同期的な流れが制御されたデータパイプライン内に複数のデバイスを接続するために用いることができる。これは、各ＣＰＵ又はＧＰＵにより適するブロックにアプリケーションを分割すること、複数のデバイスで様々なパイプライン処理段を起動させること及び／又はほとんど、さらにはすべてのデータ同期化をホストＣＰＵからオフロードすることを可能にすることができる。
【０２２５】
幾つかの例では、本開示の技法は、コマンド待ち行列を用いてタスクを開始させるマルチプルプロセッサ計算プラットフォームに関してホストデバイスで実行中のプロセスと計算デバイスで実行中のタスクとの間でのメッセージの送信及び受信を容易にするメッセージ渡しインタフェースを提供することができる。計算デバイスは、幾つかの事例では、ＧＰＵであることができる。追加の事例では、計算デバイスは、プラットフォーム横断、売り主横断型の異種計算プラットフォームＡＰＩによって定義されたあらゆるタイプの計算デバイスであることができる。
【０２２６】
さらなる例では、本開示の技法は、ホストデバイスによってアクセス可能である１つ以上のレジスタを含むＧＰＵを提供することができる。１つ以上のレジスタは、ＧＰＵで実行中のタスクとＧＰＵ以外のデバイスで実行中のプロセスとの間でのメッセージ渡しを容易にするように構成することができる。
【０２２７】
追加の例では、本開示の技法は、即時メモリオブジェクトを生成するのを可能にするメモリバッファインタフェースを提供することができる。即時メモリオブジェクトは、計算デバイスでタスクが実行している間にホストデバイスで実行中のプロセスと計算デバイスで実行中のタスクとの間でデータを共有するためにキャッシング不能な共有メモリスペース及び／又はキャッシュコヒーレントな共有メモリスペースを実装するために用いることができる。計算デバイスは、幾つかの事例においては、グラフィックス処理装置（ＧＰＵ）であることができる。追加の事例では、計算デバイスは、プラットフォーム横断、売り主横断型の異種計算プラットフォームＡＰＩによって定義されたあらゆるタイプの計算デバイスであることができる。
【０２２８】
さらなる例では、本開示の技法は、キャッシング不能な共有メモリスペースを提供するために選択的にディスエーブルにすることができる共有メモリスペースのためのキャッシュを含むＧＰＵを提供することができる。追加の例では、本開示の技法は、キャッシュコヒーレントな共有メモリスペースを提供するために選択的にイネーブルにすることができるキャッシュコヒーレンシーモードを含むＧＰＵを提供することができる。
【０２２９】
本開示において説明される技法は、少なくとも部分的には、ハードウェア、ソフトウェア、ファームウェア又はそれらの組み合わせ内に実装することができる。例えば、説明される技法の様々な態様を、１つ以上のプロセッサ内に実装することができ、１つ以上のマイクロプロセッサ、デジタル信号プロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、その他の同等の集積回路又はディスクリート論理回路、及び、該コンポーネントのあらゆる組み合わせを含む。用語“プロセッサ”又は“処理回路”は、概して、単独での又はその他の論理回路と組み合わせた上記の論理回路、又は、あらゆるその他の同等の回路、例えば、処理を行うディスクリートハードウェアのうちのいずれかを意味することができる。
【０２３０】
該ハードウェア、ソフトウェア、及びファームウェアは、本開示において説明される様々な動作及び機能をサポートするために同じデバイス内に又は別々のデバイス内に実装することができる。さらに、説明されるユニット、モジュール又はコンポーネントのいずれも、個別のただし相互運用可能な論理デバイスとしてまとめて又は別々に実装することができる。異なる特徴をモジュール又はユニットとして描写することは、異なる機能上の態様を強調することが意図されており、該モジュール又はユニットを別個のハードウェアコンポーネント又はソフトウェアコンポーネントによって実現させなければならないということは必ずしも意味しない。むしろ、１つ以上のモジュール又はユニットと関連付けられた機能は、別個のハードウェア、ファームウェア、及び／又はソフトウェアコンポーネントによって実行すること、又は、共通の又は別個のハードウェアコンポーネント又はソフトウェアコンポーネント内に組み入れることができる。
【０２３１】
本開示において説明される技法は、コンピュータによって読み取り可能な媒体、例えば、命令を格納するコンピュータによって読み取り可能な記憶媒体、において格納すること、具現化すること又は符号化することもできる。コンピュータによって読み取り可能な媒体において埋め込まれた又は符号化された命令は、例えば、１つ以上のプロセッサによって命令が実行されるときに、ここにおいて説明される技法を実行することを１つ以上のプロセッサに行わせることができる。コンピュータによって読み取り可能な記憶媒体は、ランダムアクセスメモリ（ＲＡＭ）、読み取り専用メモリ（ＲＯＭ）、プログラマブル読み取り専用メモリ（ＰＲＯＭ）、消去可能プログラマブル読み取り専用メモリ（ＥＰＲＯＭ）、電子的に消去可能なプログラマブル読み取り専用メモリ（ＥＥＰＲＯＭ）、フラッシュメモリ、ハードディスク、ＣＤ−ＲＯＭ、フロッピー（登録商標）ディスク、カセット、磁気媒体、光学媒体、又は有形であるその他のコンピュータによって読み取り可能な記憶媒体を含むことができる。
【０２３２】
コンピュータによって読み取り可能な媒体は、有形な記憶媒体、例えば、上記のそれら、に対応するコンピュータによって読み取り可能な記憶媒体を含むことができる。コンピュータによって読み取り可能な媒体は、例えば、通信プロトコルによる１カ所から他へのコンピュータプログラムの転送を容易にするあらゆる媒体を含む通信媒体も備えることができる。このように、句“コンピュータによって読み取り可能な媒体”は、概して、（１）非一時的である有形なコンピュータによって読み取り可能な記憶媒体、及び（２）非有形なコンピュータによって読み取り可能な通信媒体、例えば、一時的な信号又は搬送波、に対応することができる。
【図１】
2013537993.tif 000012
【図２】
2013537993.tif 000013
【図３】
2013537993.tif 000014
【図４】
2013537993.tif 000015
【図５】
2013537993.tif 000016
【図６】
2013537993.tif 000017
【図７】
2013537993.tif 000018
【図８】
2013537993.tif 000019
【図９】
2013537993.tif 000020
【図１０】
2013537993.tif 000021
【図１１】
2013537993.tif 000022
【図１２】
2013537993.tif 000023
【図１３】
2013537993.tif 000024
【図１４】
2013537993.tif 000025
【図１５】
2013537993.tif 000026
【図１６】
2013537993.tif 000027
【図１７】
2013537993.tif 000028
【図１８】
2013537993.tif 000029
【図１９】
2013537993.tif 000030
【図２０】
2013537993.tif 000031
【図２１】
2013537993.tif 000032
【図２２】
2013537993.tif 000033
【図２３】
2013537993.tif 000034
【図２４】
2013537993.tif 000035
【図２５】
2013537993.tif 000036
【図２６】
2013537993.tif 000037
【図２７】
2013537993.tif 000038
【図２８】
2013537993.tif 000039
【図２９】
2013537993.tif 000040
【図３０】
2013537993.tif 000041
【図３１】
2013537993.tif 000042
【図３２】
2013537993.tif 000043
【国際調査報告】
2013537993.tif 000044
2013537993.tif 000045