(57)【要約】  本明細書の実施形態は、ライブラリ（１３０）を使用してニューラルネットワークアプリケーション（１２０）をニューラルネットワークアクセラレータ（１６５）とインターフェースするための技法について説明する。ニューラルネットワークアプリケーション（１２０）は、ホストコンピューティングシステム（１０５）上で実行し得るが、ニューラルネットワークアクセラレータ（１６５）は、超並列ハードウェアシステム、たとえば、ＦＰＧＡ（１５０）上で実行する。ライブラリ（１３０）は、ニューラルネットワークアプリケーション（１２０）から受信されたタスクをニューラルネットワークアクセラレータ（１６５）にサブミットするためにパイプライン（５００）を動作させる。一実施形態では、パイプライン（５００）は、各々異なるスレッドに対応する、前処理ステージ、ＦＰＧＡ実行ステージ、および後処理ステージ（１３５）を含む。ニューラルネットワークアプリケーション（１２０）からタスクを受信すると、ライブラリ（１３０）は、パイプライン中の異なるステージがタスクを実施するために必要とされる情報を含むパケット（４１０）を生成する。それらのステージが異なるスレッド（４１５）に対応するので、ライブラリ（１３０）は、複数のパケットを並列に処理することができ、これは、ハードウェアシステム上のニューラルネットワークアクセラレータ（１６５）の利用率を増加させることができる。【選択図】図３
2020537784.tif 000002
【特許請求の範囲】
【請求項１】
ニューラルネットワークアクセラレータにサブミットされるタスクをパイプライン化するための方法であって、前記方法は、
ニューラルネットワークアプリケーションから、前記ニューラルネットワークアクセラレータによって処理されるべき第１のタスクを受信することと、
１つまたは複数のコンピュータプロセッサを使用して、パイプライン中の複数のステージによって使用される情報を含んでいるパケットを生成することと、
前記複数のステージにおいて前記パケットを処理することであって、前記複数のステージのうちの少なくとも１つが、前記ニューラルネットワークアクセラレータを実行するハードウェアシステムへの呼出しを実施し、前記パイプラインが、前記パケットを処理することと並列に、第２のタスクに対応する少なくとも１つの他のパケットを処理する、前記パケットを処理することと、
前記パイプラインを使用して前記パケットを処理した結果を前記ニューラルネットワークアプリケーションに返すことと
を含む、方法。
【請求項２】
前記複数のステージにおいて前記パケットを処理することは、
前処理ステージにおいて前記パケットを処理することと、
前記前処理ステージの後に行われる実行ステージにおいて前記パケットを処理することであって、前記ハードウェアシステムへの前記呼出しが、前記実行ステージ中に行われる、実行ステージにおいて前記パケットを処理することと、
前記実行ステージの後の後処理ステージにおいて前記パケットを処理することと
を含む、請求項１に記載の方法。
【請求項３】
前記前処理ステージにおいて前記パケットを処理することが、
前記第１のタスクに対応するデータを、前記ニューラルネットワークアプリケーションによって使用される第１のフォーマットから、前記ハードウェアシステムによって使用される第２のフォーマットに変換すること
を含み、
前記後処理ステージにおいて前記パケットを処理することが、前記結果を前記第２のフォーマットから前記第１のフォーマットに変換することを含む、請求項２に記載の方法。
【請求項４】
前記複数のステージの各々が、他のスレッドから独立して前記パケットを処理するそれぞれのスレッドを含む、請求項１に記載の方法。
【請求項５】
前記ニューラルネットワークアプリケーションのためのメモリの割り当てブロックを、前記ハードウェアシステム中の前記ニューラルネットワークアクセラレータのためのメモリの割り当てブロックにマッピングするメモリマップを生成することと、
前記メモリマップに基づいて前記ニューラルネットワークアプリケーションから受信された第１のメモリアドレスを、前記ハードウェアシステム中のメモリブロックのための第２のメモリアドレスに変換することと
をさらに含む、請求項１に記載の方法。
【請求項６】
ニューラルネットワークの複数の層を実施するために使用される重みを、行列フォーマットにおいて前記ハードウェアシステムに転送することと、
新しいタスクに対応する前記重みのサブセットを識別することと、
前記パケットを処理するときに使用されるべきである前記重みの前記サブセットを示すオフセットを前記ハードウェアシステムに送信することと
をさらに含む、請求項１に記載の方法。
【請求項７】
前記ハードウェアシステム上の前記ニューラルネットワークアクセラレータの実行に関するメトリックを取得することと、
表示のために前記メトリックの視覚表現を出力することと、
前記ニューラルネットワークアクセラレータの利用率を増加させるように、前記パイプライン中の前記複数のステージを実行するハードウェアリソースを調整することと
をさらに含む、請求項１に記載の方法。
【請求項８】
前記パイプライン中の前記複数のステージがライブラリにおいて定義され、前記ライブラリは、異なるタイプのニューラルネットワークアプリケーションがタスクを前記ニューラルネットワークアクセラレータにサブミットするために前記パイプライン中の前記複数のステージを使用することを可能にするように構成されたアプリケーションプログラムインターフェース（ＡＰＩ）を含む、請求項１に記載の方法。
【請求項９】
プロセッサと、
ライブラリを備えるメモリと
を備えるコンピューティングシステムであって、前記ライブラリは、前記プロセッサによって実行されたとき、
ニューラルネットワークアプリケーションから、ニューラルネットワークアクセラレータによって処理されるべき第１のタスクを受信することと、
１つまたは複数のコンピュータプロセッサを使用して、パイプライン中の複数のステージによって使用される情報を含んでいるパケットを生成することと、
前記複数のステージにおいて前記パケットを処理することであって、前記複数のステージのうちの少なくとも１つが、前記ニューラルネットワークアクセラレータを実行するハードウェアシステムへの呼出しを実施し、前記パイプラインが、前記パケットを処理することと並列に、第２のタスクに対応する少なくとも１つの他のパケットを処理する、前記パケットを処理することと、
前記パイプラインを使用して前記パケットを処理した結果を前記ニューラルネットワークアプリケーションに返すことと
を含む動作を実施する、コンピューティングシステム。
【請求項１０】
前記複数のステージにおいて前記パケットを処理することは、
前処理ステージにおいて前記パケットを処理することと、
前記前処理ステージの後に行われる実行ステージにおいて前記パケットを処理することであって、前記ハードウェアシステムへの前記呼出しが、前記実行ステージ中に行われる、実行ステージにおいて前記パケットを処理することと、
前記実行ステージの後の後処理ステージにおいて前記パケットを処理することと
を含む、請求項９に記載のコンピューティングシステム。
【請求項１１】
前記前処理ステージにおいて前記パケットを処理することが、
前記第１のタスクに対応するデータを、前記ニューラルネットワークアプリケーションによって使用される第１のフォーマットから、前記ハードウェアシステムによって使用される第２のフォーマットに変換すること
を含み、
前記後処理ステージにおいて前記パケットを処理することが、前記結果を前記第２のフォーマットから前記第１のフォーマットに変換することを含む、請求項１０に記載のコンピューティングシステム。
【請求項１２】
前記動作が、
前記ニューラルネットワークアプリケーションのためのメモリの割り当てブロックを、前記ハードウェアシステム中の前記ニューラルネットワークアクセラレータのためのメモリの割り当てブロックにマッピングするメモリマップを生成することと、
前記メモリマップに基づいて前記ニューラルネットワークアプリケーションから受信された第１のメモリアドレスを、前記ハードウェアシステム中のメモリブロックのための第２のメモリアドレスに変換することと
をさらに含む、請求項９に記載のコンピューティングシステム。
【請求項１３】
前記動作が、
ニューラルネットワークの複数の層を実施するために使用される重みを、行列フォーマットにおいて前記ハードウェアシステムに転送することと、
新しいタスクに対応する前記重みのサブセットを識別することと、
前記パケットを処理するときに使用されるべきである前記重みの前記サブセットを示すオフセットを前記ハードウェアシステムに送信することと
をさらに含む、請求項９に記載のコンピューティングシステム。
【請求項１４】
前記動作が、
前記ハードウェアシステム上の前記ニューラルネットワークアクセラレータの実行に関するメトリックを取得することと、
表示のために前記メトリックの視覚表現を出力することと、
前記ニューラルネットワークアクセラレータの利用率を増加させるように、前記パイプライン中の前記複数のステージを実行するハードウェアリソースを調整することと
をさらに含む、請求項９に記載のコンピューティングシステム。
【請求項１５】
前記パイプライン中の前記複数のステージが前記ライブラリにおいて定義され、前記ライブラリは、異なるタイプのニューラルネットワークアプリケーションがタスクを前記ニューラルネットワークアクセラレータにサブミットするために前記パイプライン中の前記複数のステージを使用することを可能にするように構成されたＡＰＩを含む、請求項９に記載のコンピューティングシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示の例は、一般に、ホストコンピューティングシステム上で実行するニューラルネットワークアプリケーションと、ニューラルネットワークアクセラレータとの間の通信に関する。
【背景技術】
【０００２】
機械学習は、コンピューティングシステムが、明示的にプログラムされることなしに働くことを引き起こす科学である。古典的な機械学習は、Ｋ平均クラスタリング、線形およびロジスティック回帰、確率的勾配降下法、相関ルール学習などを含む、様々なクラスタリングおよび分類技法を含む。深層学習は、機械学習におけるより新しい最先端領域である。深層学習は、特徴抽出および変換のために非線形処理ユニットの複数の層を使用する機械学習アルゴリズムのクラスである。深層学習アルゴリズムは、教師なし（たとえば、パターン分析）であるか、または教師あり（たとえば、分類）であり得る。深層学習アルゴリズムは、（本明細書では「ニューラルネットワーク」と呼ばれる）人工ニューラルネットワーク（ＡＮＮ）の層を使用して実装され得る。
【０００３】
概して、ニューラルネットワークは、グラフ中で結合されたノード（すなわち、「ニューロン」）の集合である。ニューラルネットワーク中のノードは、重み付けされた入力の和を算出し、その和に随意のバイアスを加算する。ノードの出力は、（「活性化関数」と呼ばれる）最終的な和の関数である。例示的な活性化関数は、シグモイド関数、双曲線正接（ｔａｎｈ）関数、正規化線形ユニット（ＲｅＬＵ）関数、および恒等関数を含む。ニューラルネットワークモデルは、しばしば、特定のトポロジーと、対応する重みおよびバイアスとを定義するノードの層に編成される。重みおよびバイアスは、ネットワークパラメータと呼ばれる。
【０００４】
概して、ニューラルネットワークは、入力層と出力層とを含み、入力層と出力層との間の１つまたは複数の隠れ層を随意に含むことができる。深層学習アプリケーションにおいて使用されるニューラルネットワークは、典型的に、多くの隠れ層を含み、それにより、深層ニューラルネットワーク（ＤＮＮ）という用語が生じる。ニューラルネットワークの層は、密結合される（たとえば、層中の各ノードが前の層中のすべてのノードに全結合される）か、またはスパース結合され得る（たとえば、層中の各ノードが前の層中のノードの一部のみに結合される）。畳み込みニューラルネットワーク（ＣＮＮ）は、畳み込み層と呼ばれる、１つまたは複数のスパース結合された層を含む、ＤＮＮのタイプである。ＣＮＮは、画像またはビデオデータを処理するのに好適である。ＤＮＮの他のタイプは、音声およびテキストデータを処理するのに好適であるリカレントニューラルネットワーク（ＲＮＮ）を含む。
【０００５】
現代のフィールドプログラマブルゲートアレイ（ＦＰＧＡ）は、超並列ハードウェアシステムをもたらすために利用され得る、数百万個のルックアップテーブルと、数千個のデジタル信号処理（ＤＳＰ）およびランダムアクセスメモリブロック（ＢＲＡＭ）とを与える。ＦＰＧＡ中のプログラマブル論理は、並列ハードウェアシステムを使用して（概して、アクセラレーション回路と呼ばれる）ニューラルネットワークアクセラレータを実行することができる１つまたは複数のカーネルを形成することができる。
【０００６】
ＦＰＧＡの利用率（ｕｔｉｌｉｚａｔｉｏｎ）を増加させることは、ニューラルネットワークアプリケーションの性能を改善することができる。したがって、ＦＰＧＡがニューラルネットワークアプリケーションによって与えられるタスクを実行するのに忙しい時間の量が多いほど、ニューラルネットワークは、速く処理し、結果を与えることができる。しかしながら、ニューラルネットワーク設計者は、ＦＰＧＡ上でニューラルネットワークアクセラレータを十分に利用するために必要とされる、必要とされる技能および専門知識を有しないことがある。
【発明の概要】
【０００７】
ニューラルネットワークをスケジュールするための技法が説明される。一例は、ニューラルネットワークアクセラレータにサブミットされるタスクをパイプライン化するための方法である。本方法は、ニューラルネットワークアプリケーションから、ニューラルネットワークアクセラレータによって処理されるべき第１のタスクを受信することと、パイプライン中の複数のステージによって使用される情報を含んでいるパケットを生成することと、複数のステージにおいてパケットを処理することであって、複数のステージのうちの少なくとも１つが、ニューラルネットワークアクセラレータを実行するハードウェアシステムへの呼出しを実施し、パイプラインが、パケットを処理することと並列に、第２のタスクに対応する少なくとも１つの他のパケットを処理する、パケットを処理することとを含む。本方法は、パイプラインを使用してパケットを処理した結果をニューラルネットワークアプリケーションに返すことをも含む。
【０００８】
いくつかの実施形態では、複数のステージにおいてパケットを処理することは、前処理ステージ（ｐｒｅ−ｐｒｏｃｅｓｓｉｎｇ  ｓｔａｇｅ）においてパケットを処理することと、前処理ステージの後に行われる実行ステージ（ｅｘｅｃｕｔｅ  ｓｔａｇｅ）においてパケットを処理することであって、ハードウェアシステムへの呼出しが、実行ステージ中に行われ得る、実行ステージにおいてパケットを処理することと、実行ステージの後の後処理ステージ（ｐｏｓｔ−ｐｒｏｃｅｓｓｉｎｇ  ｓｔａｇｅ）においてパケットを処理することとを含み得る。
【０００９】
いくつかの実施形態では、前処理ステージにおいてパケットを処理することは、第１のタスクに対応するデータを、ニューラルネットワークアプリケーションによって使用される第１のフォーマットから、ハードウェアシステムによって使用される第２のフォーマットに変換することを含み得る。後処理ステージにおいてパケットを処理することは、結果を第２のフォーマットから第１のフォーマットに変換することを含み得る。
【００１０】
いくつかの実施形態では、複数のステージの各々は、他のスレッドから独立してパケットを処理するそれぞれのスレッドを含み得る。
【００１１】
いくつかの実施形態では、本方法は、ニューラルネットワークアプリケーションのためのメモリの割り当てブロックを、ハードウェアシステム中のニューラルネットワークアクセラレータのためのメモリの割り当てブロックにマッピングするメモリマップを生成することと、メモリマップに基づいてニューラルネットワークアプリケーションから受信された第１のメモリアドレスを、ハードウェアシステム中のメモリブロックのための第２のメモリアドレスに変換することとをさらに含み得る。
【００１２】
いくつかの実施形態では、本方法は、ニューラルネットワークの複数の層を実施するために使用される重みを、行列フォーマットにおいてハードウェアシステムに転送することと、新しいタスクに対応する重みのサブセットを識別することと、パケットを処理するときに使用されるべきである重みのサブセットを示すオフセットをハードウェアシステムに送信することとをさらに含み得る。
【００１３】
いくつかの実施形態では、本方法は、ハードウェアシステム上のニューラルネットワークアクセラレータの実行に関するメトリックを取得することと、表示のためにメトリックの視覚表現を出力することと、ニューラルネットワークアクセラレータの利用率を増加させるように、パイプライン中の複数のステージを実行するハードウェアリソースを調整することとをさらに含み得る。
【００１４】
いくつかの実施形態では、パイプライン中の複数のステージはライブラリにおいて定義され得る。ライブラリは、異なるタイプのニューラルネットワークアプリケーションがタスクをニューラルネットワークアクセラレータにサブミットするためにパイプライン中の複数のステージを使用することを可能にするように構成されたアプリケーションプログラムインターフェース（ＡＰＩ）を含み得る。
【００１５】
いくつかの実施形態では、本方法は、ニューラルネットワークアクセラレータに情報を与えるために使用されるパケット中の複数のフィールドをカスタマイズすることをさらに含み得る。カスタマイズされた複数のフィールドは、ニューラルネットワークアクセラレータのタイプによって変動し得、異なるタイプのニューラルネットワークアクセラレータは、異なるフィールドを使用し得る。
【００１６】
いくつかの実施形態では、本方法は、デバッグ機能がアクティブであるかどうかを決定すること、およびパケットをニューラルネットワークアクセラレータにサブミットすることと、パケットを、ニューラルネットワークアプリケーションを実行するホスト中の１つまたは複数のコンピュータプロセッサにサブミットすることとの間で切り替えることをさらに含み得る。
【００１７】
別の例は、１つまたは複数の処理デバイス上で実行されたとき、ニューラルネットワークアクセラレータにサブミットされるタスクをパイプライン化するための動作（ｏｐｅｒａｔｉｏｎ）を実施する命令を記憶する非一時的コンピュータ可読記憶媒体である。動作は、ニューラルネットワークアプリケーションから、ニューラルネットワークアクセラレータによって処理されるべき第１のタスクを受信することと、パイプライン中の複数のステージによって使用される情報を含んでいるパケットを生成することと、複数のステージにおいてパケットを処理することであって、複数のステージのうちの少なくとも１つが、ニューラルネットワークアクセラレータを実行するハードウェアシステムへの呼出しを実施し、パイプラインが、パケットを処理することと並列に、第２のタスクに対応する少なくとも１つの他のパケットを処理する、パケットを処理することとを含む。動作は、パイプラインを使用してパケットを処理した結果をニューラルネットワークアプリケーションに返すことをも含む。
【００１８】
別の例は、プロセッサとメモリとを含むコンピューティングシステムである。メモリは、プロセッサによって実行されたとき、動作を実施するライブラリを含む。動作は、ニューラルネットワークアプリケーションから、ニューラルネットワークアクセラレータによって処理されるべき第１のタスクを受信することと、パイプライン中の複数のステージによって使用される情報を含んでいるパケットを生成することと、複数のステージにおいてパケットを処理することであって、複数のステージのうちの少なくとも１つが、ニューラルネットワークアクセラレータを実行するハードウェアシステムへの呼出しを実施し、パイプラインが、パケットを処理することと並列に、第２のタスクに対応する少なくとも１つの他のパケットを処理する、パケットを処理することとを含む。動作は、パイプラインを使用してパケットを処理した結果をニューラルネットワークアプリケーションに返すことをも含む。
【００１９】
いくつかの実施形態では、複数のステージにおいてパケットを処理することは、前処理ステージにおいてパケットを処理することと、前処理ステージの後に行われる実行ステージにおいてパケットを処理することであって、ハードウェアシステムへの呼出しが、実行ステージ中に行われ得る、実行ステージにおいてパケットを処理することと、実行ステージの後の後処理ステージにおいてパケットを処理することとを含み得る。
【００２０】
いくつかの実施形態では、前処理ステージにおいてパケットを処理することは、第１のタスクに対応するデータを、ニューラルネットワークアプリケーションによって使用される第１のフォーマットから、ハードウェアシステムによって使用される第２のフォーマットに変換することを含み得、後処理ステージにおいてパケットを処理することは、結果を第２のフォーマットから第１のフォーマットに変換することを含み得る。
【００２１】
いくつかの実施形態では、動作は、ニューラルネットワークアプリケーションのためのメモリの割り当てブロックを、ハードウェアシステム中のニューラルネットワークアクセラレータのためのメモリの割り当てブロックにマッピングするメモリマップを生成することと、メモリマップに基づいてニューラルネットワークアプリケーションから受信された第１のメモリアドレスを、ハードウェアシステム中のメモリブロックのための第２のメモリアドレスに変換することとをさらに含み得る。
【００２２】
いくつかの実施形態では、動作は、ニューラルネットワークの複数の層を実施するために使用される重みを、行列フォーマットにおいてハードウェアシステムに転送することと、新しいタスクに対応する重みのサブセットを識別することと、パケットを処理するときに使用されるべきである重みのサブセットを示すオフセットをハードウェアシステムに送信することとをさらに含み得る。
【００２３】
いくつかの実施形態では、動作は、ハードウェアシステム上のニューラルネットワークアクセラレータの実行に関するメトリックを取得することと、表示のためにメトリックの視覚表現を出力することと、ニューラルネットワークアクセラレータの利用率を増加させるように、パイプライン中の複数のステージを実行するハードウェアリソースを調整することとをさらに含み得る。
【００２４】
いくつかの実施形態では、パイプライン中の複数のステージはライブラリにおいて定義され得る。ライブラリは、異なるタイプのニューラルネットワークアプリケーションがタスクをニューラルネットワークアクセラレータにサブミットするためにパイプライン中の複数のステージを使用することを可能にするように構成されたＡＰＩを含み得る。
【００２５】
いくつかの実施形態では、動作は、ニューラルネットワークアクセラレータに情報を与えるために使用されるパケット中の複数のフィールドをカスタマイズすることをさらに含み得る。カスタマイズされた複数のフィールドは、ニューラルネットワークアクセラレータのタイプによって変動し得、異なるタイプのニューラルネットワークアクセラレータは、異なるフィールドを使用し得る。
【００２６】
いくつかの実施形態では、コンピューティングシステムは、デバッグ機能がアクティブであると決定すること、およびパケットをニューラルネットワークアクセラレータにサブミットすることと、パケットを、実行のためのコンピューティングシステム中のプロセッサにサブミットすることとの間で切り替えることをさらに含み得る。
【００２７】
上記の具陳された特徴が詳細に理解され得るように、上記で手短に要約されたより詳細な説明は、添付の図面にその一部が示されている例示的な実装形態を参照することによってなされ得る。しかしながら、添付の図面は、典型的な例示的な実装形態を示すにすぎず、したがって、その範囲の限定と見なされるべきでないことに留意されたい。
【図面の簡単な説明】
【００２８】
【図１】一例による、多層ニューラルネットワークを示す図である。
【図２】一例による、ニューラルネットワークアクセラレータをニューラルネットワークアプリケーションとインターフェースするためのシステムの図である。
【図３】一例による、ニューラルネットワークアクセラレータとニューラルネットワークアプリケーションとの間の通信フローを示す図である。
【図４】一例による、ニューラルネットワークアクセラレータにおける実行のためにニューラルネットワークアプリケーションから受信されたタスクをパイプライン化するためのフローチャートである。
【図５】一例による、ニューラルネットワークアプリケーションによってサブミットされるタスクのためのパイプラインを示す図である。
【図６】一例による、ニューラルネットワークアプリケーションによってサブミットされるタスクのためのパイプラインの実行を調整するためのフローチャートである。
【図７】一例による、ニューラルネットワークアプリケーションによってサブミットされるタスクをパイプライン化することに対応するタイミングチャートである。
【図８】一例による、ニューラルネットワークを実装するためのシステムを示すブロック図である。
【図９】一例による、コンピューティングシステムを示すブロック図である。
【図１０】一例による、アクセラレーション回路を示すブロック図である。
【図１１】一例による、プログラマブル集積回路（ＩＣ）を示すブロック図である。
【図１２】一例による、プログラマブルＩＣのフィールドプログラマブルゲートアレイ（ＦＰＧＡ）実装形態を示す図である。
【発明を実施するための形態】
【００２９】
理解を容易にするために、可能な場合、図に共通である同じ要素を示すために同じ参照番号が使用されている。一例の要素が、他の例に有益に組み込まれ得ることが企図される。
【００３０】
図を参照しながら様々な特徴が以下で説明される。図は一定の縮尺で描かれることも描かれないこともあり、同様の構造または機能の要素が、図全体にわたって同様の参照番号によって表されることに留意されたい。図は、特徴の説明を容易にすることを意図されているにすぎないことに留意されたい。図は、本明細書の網羅的な説明として、または特許請求の範囲に対する限定として意図されていない。さらに、示されている例は、すべての態様または利点が示される必要があるとは限らない。特定の例に関して説明される一態様または利点は、必ずしもその例に限定されるとは限らず、そのように示されていない場合でも、またはそのように明示的に説明されていない場合でも、任意の他の例において実施され得る。
【００３１】
本明細書の実施形態は、ライブラリを使用してニューラルネットワークアプリケーションをニューラルネットワークアクセラレータとインターフェースするための技法について説明する。たとえば、ニューラルネットワークアプリケーションは、ホストコンピューティングシステム上で実行し得るが、ニューラルネットワークアクセラレータは、超並列ハードウェアシステム、たとえば、ＦＰＧＡ、グラフィックス処理ユニット（ＧＰＵ）、または特殊設計された特定用途向け集積回路（ＡＳＩＣ）上で実行する。一実施形態では、（アクセラレータとニューラルネットワークアプリケーションとの間のインターフェースエンジンまたはアダプタと呼ばれることもある）ライブラリは、ニューラルネットワークアプリケーションから受信されたタスクをニューラルネットワークアクセラレータにサブミットするためにパイプラインを動作させるコードを含む。一実施形態では、パイプラインは、各々異なるスレッドに対応する、前処理ステージ、ＦＰＧＡ実行ステージ（ｅｘｅｃｕｔｉｏｎ  ｓｔａｇｅ）、および後処理ステージを含む。ニューラルネットワークアプリケーションからタスクを受信すると、ライブラリは、パイプライン中の異なるステージがタスクを実施するために必要とされる情報を含むパケットを生成する。それらのステージが異なるスレッドに対応するので、ライブラリは、複数のパケットを並列に処理することができる。すなわち、ライブラリは、第２のパケットが実行ステージにあり、第３のパケットが後処理ステージにある間、前処理ステージにおいて第１のパケットを処理することができる。そうすることは、超並列ハードウェアシステム上のニューラルネットワークアクセラレータの利用率を増加させ得る。すなわち、各処理サイクル中に、ライブラリは、実行ステージにおいて異なるパケット（またはタスク）をサブミットし、それにより、ニューラルネットワークアクセラレータが、新しいデータを待っている、またはすでに処理されたデータをライブラリが取り出すのを待っている、ダウンタイムを最小限に抑えることができる。
【００３２】
一実施形態では、ライブラリは、ニューラルネットワークアプリケーションに割り当てられたホストコンピューティングシステム中のメモリブロックと、ニューラルネットワークアクセラレータに割り当てられた超並列ハードウェアシステム中のメモリブロックとの間のメモリマップを維持する。ライブラリは、ホストコンピューティングシステム中のメモリブロックの変更を検出し、それらの変更を超並列ハードウェアシステム中のメモリブロックにおいて自動的にミラーリングすることができる。別の例では、ライブラリは、超並列ハードウェアシステム中のメモリブロックへの１つの書込みを実施し、次いで、２つのシステム間で転送されるデータの量を低減するためにメモリマップによるオフセットアドレスを使用することができる。
【００３３】
別の実施形態では、ライブラリは、ニューラルネットワークアクセラレータの利用率に関するメトリックを与える。これらのメトリックは、リアルタイムで（または遅延して）ニューラルネットワークのオペレータに視覚的に出力され得、次いで、オペレータは、パイプラインのための調整を識別することができる。たとえば、ニューラルネットワークアクセラレータが、次のパケットが前処理ステージから入手可能である前に実行ステージ中にパケットを処理することを終了することができる場合、オペレータは、パイプラインの全体的実行の速度を上げるために前処理ステージを実行するスレッドに追加のハードウェアリソース（たとえば、より多くの処理能力）を割り当てることができる。
【００３４】
図１は、一例による、多層ニューラルネットワーク１００を示す。本明細書で使用されるニューラルネットワーク１００は、機械学習において使用される計算モジュールであり、人工ニューロンと呼ばれる結合されたユニットの大きい集合に基づき、ニューロン間の結合は、変動する強度の活性化信号を搬送する。ニューラルネットワーク１００は、明示的にプログラムされるのではなく、例からトレーニングされ得る。一実施形態では、ニューラルネットワーク１００中のニューロンは、層、たとえば、層１、層２、層３などにおいて結合され、データが、第１の層、たとえば、層１から、最後の層、たとえば、層７に進む。７つの層が図１に示されているが、ニューラルネットワーク１００は数百個または数千個の異なる層を含むことができる。
【００３５】
ニューラルネットワークは、コンピュータビジョン、特徴検出、音声認識など、任意の数のタスクを実施することができる。図１では、ニューラルネットワーク１００は、デジタル画像中の物体を分類する、顔認識を実施する、テキストを識別するなど、デジタル画像中の特徴を検出する。そうするために、画像データ１０５が、ニューラルネットワーク中の第１の層に供給され、第１の層は、画像データ１０５に対して、対応する関数、この例では、１０×１０畳み込みを実施する。次いで、その関数の結果は、次の層、たとえば、層２に受け渡され、層２は、処理された画像データを次のレベルに受け渡す前に層２の関数を実施し、以下同様である。層によって処理された後に、データは画像分類器１０２において受信され、画像分類器１０２は、画像データ中の特徴を検出することができる。
【００３６】
層は、層１が層２の前に実施され、層２が層３の前に実施され、以下同様であるように、連続した順序で定義される。したがって、下位層と（１つまたは複数の）上位層との間にデータ依存性が存在する。層２は層１からデータを受信するのを待つが、一実施形態では、ニューラルネットワーク１００は、各層がコンカレントに動作することができるように並列化され得る。すなわち、各クロックサイクル中に、層は、新しいデータを受信し、処理されたデータを出力することができる。たとえば、各クロックサイクル中に、新しい画像データ１０５が層１に与えられ得る。簡単のために、各クロックサイクル中に、新しい画像が層１に与えられ、各層が、前のクロックサイクル中で受信された画像データのために、処理されたデータを出力することができると仮定する。並列化されたパイプラインを形成するように層がハードウェアで実装された場合、７つのクロックサイクルの後に、層の各々は（７つの異なる画像上であろうとも）画像データを処理するためにコンカレントに動作する。したがって、並列パイプラインを形成するように層をハードウェアで実装することは、層を一度に１つ動作させることと比較して、ニューラルネットワークのスループットを非常に増加させることができる。超並列ハードウェアシステム中の層をスケジュールすることのタイミング利益は、ニューラルネットワーク１００中の層の数が増加するにつれてさらに改善する。
【００３７】
図２は、一例による、ニューラルネットワークアクセラレータ１６５をニューラルネットワークアプリケーション１２０とインターフェースするためのシステム２００である。システム２００は、ホスト１０５（たとえば、ホストコンピューティングシステム）とＦＰＧＡ１５０とを含む。ＦＰＧＡが詳細に示されているが、本明細書の実施形態は、ライブラリ１３０を使用して、任意のタイプのハードウェアシステム、たとえば、ＧＰＵまたはＡＳＩＣ上にホストされたニューラルネットワークアクセラレータ１６５（たとえば、アクセラレーション回路またはカーネルアクセラレータ回路）を、ニューラルネットワークアプリケーション１２０とインターフェースするために使用され得る。
【００３８】
ホスト１０５はプロセッサ１１０とメモリ１１５とを含む。プロセッサ１１０は、任意の数の処理コアを各々含むことができる任意の数の処理要素を表す。メモリ１１５は、揮発性メモリ要素、不揮発性メモリ要素、およびそれらの組合せを含むことができる。その上、メモリ１１５は、異なる媒体（たとえば、ネットワークストレージまたは外部ハードドライブ）にわたって分散され得る。
【００３９】
メモリ１１５は、一実施形態では、プロセッサ１１０によって実行されるソフトウェアアプリケーションであるニューラルネットワークアプリケーション１２０を含むが、他の例では、ニューラルネットワークアプリケーション１２０はハードウェア要素を含むことができる。ニューラルネットワークアプリケーション１２０は、異なる関数、たとえば、畳み込み、最大プーリング、ｉｍ２ｃｏｌ、行列乗算などを実施する任意の数の層を有することができるニューラルネットワーク、たとえば、図１に示されているニューラルネットワーク１００を確立する。示されていないが、ニューラルネットワークアプリケーション１２０は、メモリ１１５に記憶されたまたは外部ソースからのデータ（たとえば、画像またはオーディオデータ）を処理するためにニューラルネットワークを使用することができる。たとえば、ホスト１０５は、ユーザが画像をサブミットすることを可能にするウェブポータルに通信可能に連結され得、その画像は、次いで、ニューラルネットワークアプリケーション１２０によって処理される。
【００４０】
以下の実施形態では、ニューラルネットワークアプリケーション１２０は、ＦＰＧＡ１５０上のニューラルネットワークアクセラレータ１６５に通信可能に連結され、これにより、ニューラルネットワークの性能を改善し、たとえば、プロセッサ１１０のみに依拠するのではなく、ニューラルネットワークが複数の層をより速く実行することを可能にし得る。しかしながら、ニューラルネットワークアプリケーション１２０は、ニューラルネットワークアクセラレータ１６５とは異なるフォーマットを使用してデータを処理し得る。さらに、ホスト１０５のメモリとＦＰＧＡ１５０のメモリとは、異なる非コヒーレントメモリであり得る。
【００４１】
ライブラリ１３０は、ニューラルネットワークアプリケーション１２０をニューラルネットワークアクセラレータ１６５に通信可能に連結するための方法および動作を与える。ライブラリは、ニューラルネットワークアプリケーション１２０のためのメモリの割り当てブロック１２５を、ＦＰＧＡ１５０中のニューラルネットワークアクセラレータ１６５のためのメモリの割り当てブロック１７５にマッピングする、メモリマップ１４０（たとえば、データ構造またはデータベース）を含む。一実施形態では、ホスト１０５は、処理されるべき異なる画像を記憶するニューラルネットワークアプリケーション１２０のために、メモリの大半（すなわち、割り当てブロック１２５）を割り当て得る。たとえば、異なる画像を処理するとき、ニューラルネットワークアプリケーション１２０は、特定の画像が記憶された割り当てブロック１２５中へのオフセットをライブラリ１３０に送信し得る。メモリマップ１４０を使用して、ライブラリは、ＦＰＧＡ１５０中の対応する割り当てられた１つまたは複数のブロック１７５を識別することができる。一実施形態では、ライブラリ１３０は、同じ画像またはオーディオファイルに対応するデータが、ホスト１０５中のメモリ１１５とＦＰＧＡ１５０中のメモリ１７０との間で正しく相関され得るように、ホスト１０５およびＦＰＧＡ１５０がブロック１２５およびブロック１７５を割り当て後に、メモリマップ１４０を生成する。
【００４２】
さらに、ライブラリ１３０は、ニューラルネットワークアクセラレータ１６５によって完了されるべき、ニューラルネットワークアプリケーション１２０によってサブミットされるタスクを処理するパイプライン化ステージ（ｐｉｐｅｌｉｎｅｄ  ｓｔａｇｅ）１３５を含む。すなわち、ニューラルネットワークアプリケーション１２０からタスクを受信し、タスクをニューラルネットワークアクセラレータ１６５にサブミットし、結果を待つ代わりに、ライブラリ１３０は、異なるステージにおいて複数のタスクを並列に処理するためにパイプラインステージ（ｐｉｐｅｌｉｎｅ  ｓｔａｇｅ）１３５を使用する。一実施形態では、新しいタスクを受信すると、ライブラリ１３０は、タスクを完了するために使用されるデータを含むパケットを生成する。一実施形態では、パケットは、各パケットが、パイプラインにおいて他のパケットへのデータ依存性を有することなしに、ステージ１３５において個々に処理され得るように独立型である。ライブラリ１３０が、３つのステージ１３５（たとえば、前処理ステージ、ＦＰＧＡ実行ステージ、および後処理ステージ）をもつパイプラインを形成する場合、ライブラリ１３０は、３つのステージを使用して（アプリケーション１２０によってサブミットされる異なるタスクに各々対応することができる）３つのパケットを並列に処理することができる。そうすることは、ニューラルネットワークアクセラレータの利用率とニューラルネットワークの全体的ランタイムとを増加させることができる。
【００４３】
一実施形態では、ライブラリ１３０は、ニューラルネットワークオペレータがＦＰＧＡ１５０中のニューラルネットワークアクセラレータ１６５をどのように構成すべきか、またはどのように効率的に実行すべきかを知る必要なしに、そのオペレータがニューラルネットワークアクセラレータ１６５を使用することを可能にする。すなわち、オペレータは、典型的にＦＰＧＡ１５０中のプログラマブル論理１５５を構成するために使用されるレジスタ転送論理（ＲＴＬ）を理解する必要がない。代わりに、ライブラリ１３０は、パイプラインステージ１３５とメモリマップ１４０とを使用して、ニューラルネットワークアプリケーション１２０とニューラルネットワークアクセラレータ１６５との間の通信を抽象化する。その上、ライブラリ１３０は、ニューラルネットワークアクセラレータ１６５と通信するために異なるタイプのニューラルネットワーク（およびニューラルネットワークアプリケーション）とともに使用され得る一般的なアプリケーションプログラムインターフェース（ＡＰＩ）を与えることができる。
【００４４】
メモリ１１５は、ホスト１０５とＦＰＧＡ１５０との間の通信を可能にするＦＰＧＡドライバ１４５をも含む。一実施形態では、ＦＰＧＡドライバ１４５は、ライブラリ１３０とライブラリ１３０の対応する関数とオペレータとが、ＦＰＧＡ１５０と通信することを可能にする。その上、ＦＰＧＡドライバ１４５は、プログラマブル論理１５５およびメモリ１７０の利用率など、ＦＰＧＡ１５０中のハードウェアに関するメトリックを受信する（または要求する）ことができる。一実施形態では、ライブラリ１３０は、これらのメトリックを使用してニューラルネットワークアクセラレータ１６５の利用率の視覚表現を出力することができ、これは、スループットを増加させるようにパイプライン化ステージ１３５を調整するときにオペレータを助けることができる。
【００４５】
ＦＰＧＡ１５０は、プログラマブル論理１５５とメモリ１７０とを含む。プログラマブル論理１５５は、プログラマブル論理ブロックのアレイと、論理ブロックが通信可能に連結されることを可能にする再構成可能な相互接続の階層とを含むことができる。図２では、プログラマブル論理１５５は、１つまたは複数のニューラルネットワークアクセラレータ１６５を各々実行することができる１つまたは複数のカーネル１６０を形成する。一例では、ニューラルネットワークアクセラレータ１６５は、ニューラルネットワークのための畳み込みを実施するときに有用であるＤＳＰブロックを含む。別の実施形態では、アクセラレータ１６５は、畳み込みを実施するために行列乗算が使用され得るように、受信された画像データを（ｉｍ２ｃｏｌと呼ばれる）２Ｄ行列に変換する。しかしながら、ニューラルネットワークアプリケーション１２０は、画像がスケーリングされるときに特徴が失われないように画像中の特徴を増幅する最大プーリング、活性化関数またはランプ関数である正規化線形ユニット（ＲｅＬＵ）など、他のタイプのニューラルネットワーク関数をニューラルネットワークアクセラレータ１６５にオフロードすることができる。
【００４６】
メモリ１７０は、ＤＤＲ  ｒａｍなど、揮発性および不揮発性メモリ要素を含むことができる。ニューラルネットワークアプリケーション１２０間の通信を確立すると、ＦＰＧＡ１５０は、割り当てブロック１７５をニューラルネットワークアクセラレータ１６５に割り当てる。しかしながら、ＦＰＧＡ１５０中のメモリ１７０がホスト１０５中のメモリ１１５と共有されないことがあるので、割り当てブロック１７５についてのアドレスは、ホスト１０５中の割り当てブロック１２５のアドレスと対応しない。その上、割り当てブロック１２５および１７５は、メモリ中の隣接ブロックでないことがあるか、または異なる時間に割り当てられ得る。上述のように、ライブラリ１３０は、割り当てブロック１２５および１７５中の個々のブロックを互いにマッピングすることができるメモリマップ１４０を含む。したがって、ライブラリ１３０は、割り当てブロック１２５中のアドレスＡに位置する画像のためのタスクを受信すると、ライブラリ１３０は、そのタスクを実施するために、そのアドレスを、割り当てブロック１７５中のアドレスＢに変換することができる。同様に、割り当てブロック１７５から結果を読み取ると、ライブラリ１３０は、結果を、割り当てブロック１２５に記憶するために、そのアドレスを対応する宛先アドレスにマッピングすることができる。
【００４７】
図３は、一例による、ニューラルネットワークアプリケーション１２０とニューラルネットワークアクセラレータ１６５との間の通信フロー３００を示す。示されているように、ライブラリ１３０およびＦＰＧＡドライバ１４５は、通信フロー３００においてニューラルネットワークアプリケーション１２０とニューラルネットワークアクセラレータ１６５との間にある。したがって、ニューラルネットワークアプリケーション１２０はタスクをライブラリ１３０にサブミットし、ライブラリ１３０は、読取り／書込みコマンドを生成し、ニューラルネットワークアクセラレータ１６５にデータを送信するためにＦＰＧＡドライバ１４５を使用する。
【００４８】
ニューラルネットワークアクセラレータ１６５は、ニューラルネットワークアプリケーション１２０によって割り当てられるタスクを完了するために、ｉｍ２ｃｏｌ２０５、行列乗算２１０、ＲｅＬＵ２１５、および最大プーリング２２０など、様々な動作を実施することができる。一実施形態では、ニューラルネットワークアプリケーション１２０は、ニューラルネットワークの単一の層を実施する、たとえば、１０×１０畳み込みを実施する、または最大プーリングを実施するために、ニューラルネットワークアクセラレータ１６５のためのタスクをサブミットする。ネットワークアクセラレータ１６５はまた、畳み込みなどの動作を、別個のｉｍ２ｃｏｌ／行列乗算ステップを通ることなしに、直接実施することができる。別の実施形態では、ニューラルネットワークアプリケーション１２０は、画像ごとにタスクをサブミットすることができ、その場合、ライブラリ１３０およびＦＰＧＡドライバ１４５は、ニューラルネットワークアクセラレータ１６５に、ニューラルネットワーク中の層のうちの選択された層ではなく、画像を処理するためにニューラルネットワーク中のすべての層を実施するように命令する。
【００４９】
ニューラルネットワークアクセラレータ１６５は、ｉｍ２ｃｏｌ２０５、行列乗算（ＭＭ）２１０、ＲｅＬＵ２１５、最大プーリング２２０など、１つまたは複数の関数を実施するための論理（たとえば、ＦＰＧＡ上に実装された場合、プログラマブル論理）を含む。一実施形態では、これらの関数は、ニューラルネットワークアクセラレータ１６５を形成する論理ブロックが並列に実行することができるようにパイプライン化され得る。すなわち、ニューラルネットワークアクセラレータ１６５におけるハードウェア論理は、ライブラリ１３０によって与えられる関数とともに並列化され得る。
【００５０】
逆方向に進んで、タスクを処理した後に、ニューラルネットワークアクセラレータ１６５は、処理されたデータをＦＰＧＡドライバ１４５に転送し、ＦＰＧＡドライバ１４５は、データをライブラリ１３０にフォワーディングする。１つまたは複数のパイプライン化ステージを使用して、ライブラリ１３０は結果を処理し、ニューラルネットワークアプリケーション１２０に結果を送信する。一実施形態では、ライブラリ１３０は、データをニューラルネットワークアプリケーション１２０からアクセラレータ１６５に送信するときの、ならびに結果をアクセラレータ１６５からアプリケーション１２０に送信するときの、フォーマットを変更する。ライブラリ１３０は、複数のタスクを同時に処理するためにパイプラインステージを使用し得る。
【００５１】
図４は、一例による、ニューラルネットワークアクセラレータにおける実行のためにニューラルネットワークアプリケーションから受信されたタスクをパイプライン化するための方法４００のフローチャートである。ブロック４０５において、ライブラリは、ニューラルネットワークアプリケーションから新しいタスクを受信する。一実施形態では、タスクは、ニューラルネットワークアプリケーションがニューラルネットワークアクセラレータに処理して欲しいデータを記憶する、ホストメモリ中のメモリアドレスを含む。そのメモリアドレスは、ニューラルネットワークアプリケーションに割り当てられたメモリのブロックについての開始メモリアドレスに対するオフセットであり得る。たとえば、ホストはメモリの大きいブロックをニューラルネットワークアプリケーションに割り当て、次いで、メモリオフセットを使用してメモリ内のサブブロックを参照し得る。
【００５２】
一実施形態では、ライブラリ中のメモリマップは、ホスト中の割り当てられたメモリのサブブロックを、ニューラルネットワークアクセラレータを実行するＦＰＧＡ中のメモリの対応するブロックにマッピングするポインタを記憶する。たとえば、ニューラルネットワークアプリケーションは、サブブロックのうちの１つに記憶された特定の画像を参照し得る。メモリマップを使用して、ライブラリは、ＦＰＧＡ中の対応するアドレスブロックを識別することができる。したがって、メモリマップは、ニューラルネットワークアプリケーションに割り当てられたホスト中のメモリを、ニューラルネットワークアクセラレーションに割り当てられたＦＰＧＡ中のメモリに同期させることができる。一実施形態では、ライブラリは、ニューラルネットワークアプリケーションに割り当てられたメモリ中で行われた変更を、ニューラルネットワークアクセラレータに割り当てられたメモリにミラーリングすることができる。しかしながら、ライブラリは、メモリの変更が他のプラットフォームにいつ伝搬されるか、および伝搬されるかどうかを選定することができる。ＤＤＲメモリ転送は費用がかかるので、ライブラリはホストへのＤＤＲ転送を最小限に抑え、できる限りデータをＦＰＧＡ上に保ち得る。たとえば、ニューラルネットワークアクセラレータがＦＰＧＡに対して４つの畳み込みを連続的に実行する（たとえば、ｃｏｎｖ１−＞ｃｏｎｖ２−＞ｃｏｎｖ３−＞ｃｏｎｖ４）場合、ライブラリは、ホスト中のメモリに、畳み込み動作のすべての入力／出力を自動的に同期させるとは限らず、代わりに、畳み込み動作の最初および最後のみを同期させ得る。すなわち、ホスト中のメモリ中で行われる変更は、ＦＰＧＡ中の対応するメモリに自動的に伝搬され、その逆も同様である。一実施形態では、ライブラリは、メモリがホストおよびＦＰＧＡ中で割り当てられるとき、メモリをマッピングするために使用されるメモリマップおよびポインタをポピュレートすることができる。
【００５３】
その上、ライブラリは、ホストとＦＰＧＡとの間でデータを転送するのにかなりの量の時間を費やすことがある。ニューラルネットワークは、ネットワーク中のニューロン間の結合の大きさを特徴づけるために重みを使用する。ニューラルネットワークの各層について使用される重みは、異なり得る。したがって、ニューラルネットワークアクセラレータにタスクを転送するとき、ニューラルネットワークアプリケーションは、１つまたは複数の層についての重みをも送信し得る。ニューラルネットワークアクセラレータは、複数回（たとえば、新しい画像が受信されるたびに）ニューラルネットワークを実行し得、これは、１つまたは複数の層が実行されるたびに、ライブラリがＦＰＧＡに重みを送信することを意味し得る。代わりに、一実施形態では、ライブラリは、１回の転送において、ニューラルネットワークアクセラレータによって実施される層についての重みを送る。一実施形態では、ライブラリは、大きい行列においてＦＰＧＡに重みを送る。ライブラリが、異なる重みをもつ異なる層を必要とする新しいタスクを受信すると、重みを転送する代わりに、ライブラリは、タスクを実施するために重みのどのサブセットが使用されるべきかを識別する、行列中へのオフセットを送信することができる。このようにして、ライブラリは、１回の転送において重みを送信し、次いで、特定のタスクについての行列中の関連する重みを識別するためにオフセットメモリアドレスを使用することができる。
【００５４】
一実施形態では、ライブラリは、どんなデータがＦＰＧＡに転送されたかを識別するために、メモリマップにおいてフラグを使用する。たとえば、ＦＰＧＡに重みを転送した後に、ライブラリは、重みを記憶する、ホスト中のメモリアドレスにフラグを付けることができる。したがって、ニューラルネットワークアプリケーションが、フラグを付けられたメモリアドレスをライブラリに送るときはいつでも、ライブラリは、そのメモリアドレスにおいて記憶されたデータが前にＦＰＧＡに送られていたと決定することができる。データを再送する代わりに、ライブラリは、ＦＰＧＡ中の、データが記憶された対応するアドレスのみを送ることができる。重みに加えて、ライブラリは、ＦＰＧＡに前に転送された画像データまたはオーディオデータを示すためにフラグを使用し得る。
【００５５】
一実施形態では、メモリが割り当てられたとき、ライブラリは、新しいメモリブロックを使用済みセットに保存し、メモリを解放するように命令されたとき、ライブラリは、ブロックを使用済みセットから未使用セットに移動する。可能なときはいつでも、ライブラリは、異なるメモリを割り当てる前に未使用メモリブロックを再使用することを試みる。言い換えれば、メモリを割り当てるための要求を受信すると、ライブラリは、最初に、メモリを未使用セットから割り当てることを試み、なぜなら、これが、整合メモリブロックからのメモリ断片化の発生を低減することができるからである。その上、そうすることは、各順方向伝搬において割り当てられたメモリのサイズおよびパターンが同等であり得る深層ニューラルネットワークの性質を利用する。
【００５６】
ブロック４１０において、ライブラリは、タスクを実施するためにパイプライン化ステージによって使用される情報を含んでいる第１のデータパケットを生成する。一実施形態では、データパケットは、パイプライン化ステージの各々がそれらのジョブを実施するために必要とされるすべての情報を含んでいる。たとえば、各ステージは、パケットを処理するとき、パケット中の１つまたは複数の異なるフィールドを使用し得る。したがって、あるステージは、パケット中で、第２のフィールドではなく第１のフィールドを使用し得るが、別のステージは、第１のフィールドではなく第２のフィールドを使用する。ライブラリがパケット中でポピュレートすることができるフィールドの非限定的な例は、行列次元、重みへのメモリオフセット、処理されるべきデータのメモリアドレス、結果が記憶されるべきであるメモリアドレス、ホストメモリへのメモリオフセットなどを含む。一実施形態では、ライブラリは、異なるニューラルネットワークアクセラレータ（たとえば、異なるカーネル）のためにフィールドをカスタマイズすることができる。すなわち、異なるタイプのアクセラレータまたは異なるカーネルは、異なるフィールドを使用し得る。
【００５７】
ブロック４１５において、ライブラリは、パイプライン中の各ステージに対応するスレッドを使用して第１のデータパケットを処理する。一実施形態では、各スレッド（すなわち、各ステージ）は、他のスレッドが他のパケットを処理するのと同時に、パケットを処理することができる。このようにして、パイプラインは、異なるタスクに対応する異なるパケットを並列に処理することができる。その上、１つのストリームからのパケットは、他のストリームからのパケットと並列に処理され得る。たとえば、ニューラルネットワークアプリケーションは、ウェブポータルからの画像の第１のストリームと、ローカルメモリ中に保存された画像の第２のストリームとを受信し得る。ライブラリは、パイプライン化ステージによって並列に処理され得る２つのストリーム中の画像からの独立したパケットを生成することができる。すなわち、パケットが独立型であるかまたは互いから独立しているので、パイプラインは、異なるソースからのパケットを並列に処理することができる。
【００５８】
図５は、一例による、ニューラルネットワークアプリケーションによってサブミットされるタスクのためのパイプライン５００を示す。パイプライン５００は、３つのステージ、すなわち、前処理ステージ、ＦＰＧＡ実行ステージ、および後処理ステージを含む。各パケットは各ステージを通過するが、他の実施形態では、いくつかのパケットはステージのうちの１つまたは複数をスキップし得る。たとえば、１つのパケット中のデータは、ライブラリが前処理ステージと後処理ステージとを実施する必要がないようにフォーマットされ得る。
【００５９】
図５では、４つのパケットが、時間期間Ａ〜Ｆ中にパイプライン５００によって処理される。時間期間Ａ中に、パケットＡが、前処理ステージに対応するスレッドによって処理される。時間期間Ｂ中に、（パケットＡを処理し終わった）前処理ステージはパケットＢを処理するが、ＦＰＧＡ実行ステージはパケットＡを処理する。時間期間Ｃ中に、前処理ステージは、ＦＰＧＡ実行ステージがパケットＢを処理すること、および後処理ステージがパケットＣを処理することと並列にパケットＣを処理する。新しいタスクがニューラルネットワークアプリケーションから受信される限り、パイプライン５００は、各時間期間中に３つのパケットを並列に処理することができる。
【００６０】
一実施形態では、時間期間の持続時間は、最も長く実行ステージに従って設定される。言い方を変えれば、ライブラリは、パケットをパイプライン中の次のステージに受け渡すことと、後続の時間期間を開始することとを行う前に、時間期間中のすべてのステージが完了するまで待つ。たとえば、前処理ステージが、完了するのに最も長くかかる場合、ライブラリは、次の時間期間に移動する前にこのステージが完了するまで待ち、これは、ＦＰＧＡ実行ステージおよび後処理ステージがすでに完了しており、アイドルであることを意味する。一実施形態では、ステージの持続時間は変動し得、それにより、時間期間の持続時間を変動させることができる。すなわち、時間期間Ｃ中に、ＦＰＧＡ実行ステージが、実行するのに最も長くかかることがあるが、時間期間Ｄ中に、後処理ステージが、実行するのに最も長くかかる。
【００６１】
一実施形態では、ライブラリは、ステージ間のパケットのフローを制御するために、および新しい時間期間が開始するときにロッキング関数を使用する。たとえば、前処理スレッドがパケットを処理し終わったとき、そのスレッドは、ＦＰＧＡ実行するスレッド（ｅｘｅｃｕｔｅ  ｔｈｒｅａｄ）のための入力キューをロックすることができる。ロックされている間、そのスレッドは、パケットを処理したことからの結果を、前処理スレッドの出力バッファからＦＰＧＡ実行ステージの入力キューに移動し、そのキューをアンロックし、ＦＰＧＡ実行ステージのスレッドに、次のパケットが処理される準備ができていることをシグナリングすることができる。ステージをロックすることは、ステージ間でパケットをハンドオフするときに、データが破損することがあるという可能性を緩和する。
【００６２】
一実施形態では、前処理ステージは、ニューラルネットワークアプリケーションから受信されたデータを、ニューラルネットワークアクセラレータを実行するハードウェアによって処理され得るフォーマットに変更する。一例では、ニューラルネットワークアプリケーションは、浮動小数点フォーマット（たとえば、３２ビット浮動小数点）においてデータを処理し得るが、ＦＰＧＡ中のハードウェア論理は、固定小数点値（たとえば、１６ビットまたは８ビット固定小数点）に関して動作する。前処理ステージは、浮動小数点値を、ニューラルネットワークアクセラレータによって処理され得る固定小数点値に変換する。
【００６３】
その上、前処理ステージは、ニューラルネットワークアプリケーションから受信されたデータを、行列フォーマット（たとえば、データの３２×６４ブロック）に変換することができる。データの行列は、ＦＰＧＡ実行ステージ中にニューラルネットワークアクセラレータの動作を並列に実施するのを助け得る。前処理ステージが完了すると、パケット中のデータは、ＦＰＧＡ中のハードウェア論理によってより容易に処理され得るフォーマットで配置される。
【００６４】
ＦＰＧＡ実行ステージ中に、対応するスレッドは、パケット（またはパケット中のデータの一部分）をＦＰＧＡに送信する。たとえば、実行ステージのためのスレッドは、対応するデータおよび重みがメモリ中のどこに記憶されるかを示す、パケットのフィールド（たとえば、メモリアドレス）を送信し得る。一実施形態では、ＦＰＧＡ実行ステージのためのスレッドは、（メモリマップを使用して）ＦＰＧＡ中の適切なメモリへのパケットの一部分の書込みを実施し、ニューラルネットワークアクセラレータを実行するカーネルを監視し、ＦＰＧＡ中のメモリから、処理された結果を取り出すために読取りを実施する。一実施形態では、そのスレッドは、エンキューコマンドを使用して、データをＦＰＧＡに移動し、１つまたは複数のカーネルに実行するように命令し、そのカーネルに対応するバッファからの結果を読み取る。このようにして、（ホスト上で動作する）ＦＰＧＡ実行ステージのスレッドは、ニューラルネットワークアクセラレータを制御および監視するために、コマンドをＦＰＧＡに送信することができる。ニューラルネットワークアクセラレータが終了され、結果が取り出されると、ＦＰＧＡ実行ステージのスレッドは、更新されたパケットを後処理ステージに受け渡す。
【００６５】
一実施形態では、後処理ステージは、パケット中のデータを、ＦＰＧＡによって使用されるデータフォーマットからニューラルネットワークアプリケーションによって使用されるデータフォーマットに変換する。たとえば、後処理ステージのスレッドは、前処理ステージに対する逆方向変換を実施する。たとえば、ＦＰＧＡからの結果は、固定小数点値から浮動小数点値に変換され得る。その上、そのスレッドは、もはやデータを行列として記憶しないことがある。
【００６６】
後処理ステージを完了した後に、ライブラリは、関連するデータをホストメモリに記憶し、タスクが完了したことをニューラルネットワークアプリケーションに通知する。一実施形態では、ライブラリはパケットの一部分のみをメモリに保存する。たとえば、パケット中のフィールドは、パイプラインステージによってのみ使用され得、したがって、パケットがパイプライン５００を横断したとき、廃棄される。
【００６７】
図５は、３つのステージを含むパイプライン５００を示しているが、ライブラリは、任意の数のステージを含むパイプラインを確立することができる。たとえば、いくつかのニューラルネットワークアプリケーションの場合、ライブラリは、ＦＰＧＡ実行ステージおよび後処理ステージのみを使用し得る。他のアプリケーションの場合、ライブラリは、パケットが同じＦＰＧＡ中の異なるニューラルネットワークアクセラレータ間で、または異なるＦＰＧＡ中の異なるニューラルネットワークアクセラレータ間で受け渡される、４つ以上のステージをもつパイプラインを含み得る。
【００６８】
方法４００に戻ると、ブロック４２０において、ライブラリは、第１のデータパケットを処理しながら、スレッドを使用して他のパケットを処理する。すなわち、図５に示されているパイプライン５００は、複数のスレッドを並列に処理することができる。したがって、前処理ステージが第１のパケットを処理する間、ＦＰＧＡ実行ステージと後処理ステージとは、他のパケットを同時に処理する（ニューラルネットワークアプリケーションが複数のタスクをサブミットしたと仮定する）。その結果、パイプラインはダウンタイムを低減し、ニューラルネットワークアクセラレータを実行するカーネルの利用率を改善することができる。たとえば、ニューラルネットワークアクセラレータが現在のパケットを処理することを終了すると、前処理ステージによって処理されるパケットは、ニューラルネットワークアクセラレータが直ちにそのパケットを処理し始めることができるように、ＦＰＧＡに転送され得る。
【００６９】
ブロック４２５において、ライブラリは、ニューラルネットワークアクセラレータを使用して第１のパケットを処理した結果をニューラルネットワークアプリケーションに返す。すなわち、第１のパケットがパイプライン（たとえば、前処理ステージ、ＦＰＧＡ実行ステージ、および後処理ステージ）を横断すると、ライブラリは、その結果を、ニューラルネットワークアプリケーションのための割り当てられたメモリに記憶し、アプリケーションに、タスクが完了したことを示すことができる。それらのステージがパイプライン化されるので、ライブラリは、複数のタスク（またはパケット）を並列に処理することができる。したがって、各時間期間の終わりに、ライブラリは、タスクを完了した結果をニューラルネットワークアプリケーションに転送し得る。それらのステージがパイプライン化されなかった場合、ライブラリは、ニューラルネットワークアプリケーションによってサブミットされる新しいタスクを開始する前にタスクが完了するのを待たなければならない。その場合、ニューラルネットワークアクセラレータは、ライブラリが前処理動作と後処理動作とを実施するとき、アイドルである。
【００７０】
図６は、一例による、ニューラルネットワークアプリケーションによってサブミットされるタスクのためのパイプラインの実行を調整するための方法６００のフローチャートである。ブロック６０５において、ライブラリは、ニューラルネットワークアクセラレータの実行に関するメトリックを取得する。一実施形態では、ライブラリは、ライブラリがＦＰＧＡ中のハードウェア要素を監視することを可能にするＦＰＧＡドライバと通信する。たとえば、ドライバは、ニューラルネットワークアクセラレータを実行するカーネルまたは計算ノードがいつ実行し始めるか、およびジョブが完了する前にどのくらい長くかかるかなど、メトリックをライブラリに報告し得る。その上、ドライバは、メモリへの読取りおよび書込み、ならびにそれらの読取りおよび書込みがどのくらい長くかかるか（これは、読取りまたは書込みを行われているデータの量に応じて変動することがある）に関して報告することができる。
【００７１】
一実施形態では、ライブラリは、このデータをドライバに要求することができる。代替的に、ドライバは、ＦＧＰＡのためのハードウェアインターフェースを自動的に監視し、これらのメトリックをライブラリに報告し得る。
【００７２】
ブロック６１０において、ライブラリは、メトリックをリアルタイムグラフィックにおいて表示する。一実施形態では、ライブラリは、ＦＰＧＡ中のニューラルネットワークアクセラレータを実行する１つまたは複数のカーネルの利用率を示すチャートを出力する。チャートは、ニューラルネットワークのオペレータがカーネルの利用率を可視化し、ライブラリによって確立されるパイプラインを改善するためのやり方を識別することを可能にする。
【００７３】
図７は、一例による、ニューラルネットワークアプリケーションによってサブミットされるタスクをパイプライン化することに対応するタイミングチャート７００である。チャート７００は、カーネルＡを使用してパケットを処理するための読取り７０５と、ＤＤＲ書込み７１０と、ＤＤＲ書込み７１５とを含み、カーネルＢを使用してパケットを処理するための読取り７２０と、ＤＤＲ書込み７２５と、ＤＤＲ書込み７３０とを含む。この実施形態では、ＦＰＧＡは、２つのニューラルネットワークアクセラレータを並列に実行することができる２つのカーネルを含む。言い換えれば、パイプラインのＦＰＧＡ実行ステージ中に、ライブラリは、カーネルＡおよびカーネルＢによって並列に実施されるべきタスクをサブミットすることができる。
【００７４】
その上、この実施形態では、ライブラリは、タスクのバッチをカーネルにサブミットする。ここで、ライブラリは、８つのタスクまたはパケットをバッチとしてカーネルの各々にサブミットする。カーネルは８つのタスクを連続的に処理する。たとえば、ＤＤＲ書込み７１０は、ライブラリが、Ｎ個のタスクのためのデータをカーネルＡと、対応するニューラルネットワークアクセラレータとのために割り当てられたメモリ中に書き込むことを表すＮ個のドットを含み得る。同様に、ＤＤＲ書込み７２５も、Ｎ個のタスクの異なるバッチがカーネルＢのために割り当てられたメモリに書き込まれることを表す同じＮ個のドットを含む。ＤＤＲ書込み７１５は、ライブラリによって生成されたパケットからの情報がＦＰＧＡに転送される時間を示す。
【００７５】
カーネルＡについての円、およびカーネルＢについてのＸは、これらのカーネルがタスクをいつ処理し始めるかを示し、ラインは、これらのタスクにかかる時間の長さを示す。示されているように、カーネルは、ほとんど常にタスクを実行している。すなわち、カーネルは、高いレートの利用率を有する。これは、カーネルがタスクを終了するときと、新しいタスクを開始するときとの間に、あるとしても、ごくわずかな間隔（またはギャップ）があることによって視覚的に示される。
【００７６】
読取り７０５および７２０は、タスクを処理するカーネルからライブラリがいつ結果を取り出すかを示す。読取り７０５は、カーネルＡによって与えられる結果を読み取ることを示すＮ個の正方形を含み、読取り７２０は、カーネルＢによって与えられる結果を読み取ることを示すＮ個のプラス符号を含む。このようにして、チャート７００は、カーネルＡおよびＢの利用率、ならびにメモリへの読取りおよび書込みを可視化し、これは、ニューラルネットワークのオペレータが、カーネル上で実行するニューラルネットワークアクセラレータの利用率または効率を決定するのを助けることができる。
【００７７】
一実施形態では、ライブラリは、チャート７００をリアルタイムで更新する。すなわち、ライブラリは、カーネルが実行され、読取りおよび書込みが実施されるとき、（左から右に開始する）チャートを生成することができる。したがって、オペレータは、生成されるチャート７００を見ることができる。一実施形態では、オペレータは、チャート上にズームインするか、または過去の結果を閲覧するためにチャートを時間的に戻すことができる。
【００７８】
タイミングチャートが示されているが、ＦＰＧＡ中のカーネルおよびＤＤＲメモリのためのメトリックは他のやり方で表示され得る。タイミングチャートの代わりに、ライブラリは、アイドル時間と実行時間との比を示す利用率パーセンテージを出力することができる。別の例では、ライブラリは、カーネルの平均利用率を示す棒グラフを出力することができる。
【００７９】
方法６００に戻ると、ブロック６１５において、ライブラリは、パイプラインステージの実行を変更するニューラルネットワークのオペレータから最適化パラメータを受信する。チャート７００を閲覧するとき、オペレータは、前処理ステージが、典型的には、ＦＰＧＡ実行ステージおよび後処理ステージよりも実行するのに長くかかることを識別していることがある。その結果、カーネルは、新しいパケット（またはパケットのバッチ）が、処理のためにニューラルネットワークアクセラレータによってサブミットされ得るように、前処理ステージを待っている間アイドルであり得る。応答して、オペレータは、パイプラインステージのうちの１つまたは複数の実行時間を変更する最適化パラメータを与えることができる。この例では、最適化パラメータは、前処理ステージの持続時間を低減し得る。
【００８０】
一実施形態では、最適化パラメータは、パイプラインステージのスレッドを実行するために割り当てられたハードウェアリソースの量である。たとえば、前処理ステージが、パイプライン中の他のステージよりも実行するのに多くの時間を常に必要とする場合、オペレータは、前処理ステージを実行するためにホスト中の追加の処理コアを割り当てることができる。そうすることは、前処理ステージが、平均して、持続時間において他のステージにより近い持続時間を有するように、その持続時間を低減し得る。その結果、パイプラインの全体的実行時間は減少し得、ＦＰＧＡ中のカーネルの利用率が増加することができる。
【００８１】
別の例では、最適化パラメータは、パイプライン化ステージを実行するスレッドにより多くの仮想メモリを割り当てること、またはスレッドがより速いメモリ要素または通信バスを使用することを可能にすることを含み得る。たとえば、ＦＰＧＡ実行ステージの持続時間は、ライブラリおよびドライバが、より速いホストＦＰＧＡ間通信方式（たとえば、ＰＣＩｅ）を使用することを可能にすることによって増加され得る。
【００８２】
ブロック６２０において、ライブラリは、受信された最適化パラメータに従ってニューラルネットワークアクセラレータの利用率を増加させるように、パイプラインのスレッドを実行するために使用されるハードウェアリソースを調整する。上述のように、ライブラリは、パイプライン化ステージのうちの１つのパイプライン化ステージのスレッドを実行するために割り当てられた処理コアの数を増加させるか、スレッドがより速いメモリ要素を使用することを可能にするか、またはホストとＦＰＧＡとの間のより速い通信経路を可能にし得る。
【００８３】
一実施形態では、ハードウェアリソースをより厳密に調整することは、パイプライン中のステージの持続時間を整合させる。言い換えれば、ライブラリは、ステージの持続時間がより等しくなるようにステージの持続時間を調整することができ、これは、ＦＰＧＡがより効率的に利用されることを意味する。そうすることは、ステージのうちのいくつかのステージの持続時間を増加させ得る。たとえば、後処理ステージが、ＦＰＧＡ実行ステージよりも短い持続時間を有するが、前処理ステージは、ＦＰＧＡ実行ステージよりも長い持続時間を有する場合。オペレータは、後処理ステージを実行するために前に割り当てられた処理コアを前処理ステージに割り当て得る。その結果、後処理ステージの持続時間は増加し、前処理ステージの持続時間は減少する。しかし、これらの持続時間が、ＦＰＧＡ実行ステージの持続時間と同じである場合、パイプラインの全体的実行時間、およびニューラルネットワークアクセラレータを実行するカーネルの利用率は増加することができる。
【００８４】
一実施形態では、ライブラリは、タスクを、外部ニューラルネットワークアクセラレータにサブミットすること、またはホストにサブミットすることの間で切り替えるためのデバッグ関数を含む。たとえば、デバッグするとき、タスクをＦＰＧＡにサブミットする代わりに、ライブラリは、ホスト上のプロセッサを使用してタスクを実行することができる。これには、より多くの時間がかかり得るが、そうすることは、問題がニューラルネットワークの設計によって引き起こされるのかニューラルネットワークアクセラレータの設計によって引き起こされるのかを決定することができる。言い方を変えれば、タスクをホストにサブミットすることによって、オペレータは、ＦＰＧＡ上でタスクを実行することによってエラーが引き起こされるかどうかを決定することができる。このようにして、ホストプロセッサは、ＦＧＰＡ特徴をデバッグするためのベースラインとして働くことができる。一実施形態では、ライブラリは、同じタスクをＦＰＧＡ上のニューラルネットワークアクセラレータとホスト上のプロセッサの両方にサブミットし、その結果を比較する。
【００８５】
図８は、一例による、ニューラルネットワークを実装するためのシステム８００を示すブロック図である。システム８００は、コンピュータシステム８０２と、１つまたは複数のコンピュータシステム８０８とを含む。コンピュータシステム８０２は、１つまたは複数の設計ツール８０４を与えるソフトウェアを実行するように構成された従来のコンピューティング構成要素を含む。各コンピュータシステム８０８は、（上記で説明された例のいずれかの場合のような）１つまたは複数のニューラルネットワーク８１０を実行する。（１つまたは複数の）ニューラルネットワーク８１０は、（上記で説明された例のいずれかの場合のような）アプリケーション８１２と、（上記で説明された例のいずれかの場合のような）アクセラレーションライブラリ８１４と、（上記で説明された例のいずれかの場合のような）１つまたは複数のハードウェアアクセラレータ８１６とを使用して実装される。
【００８６】
一例では、（１つまたは複数の）ハードウェアアクセラレータ８１６は、ＦＰＧＡなどのプログラマブルＩＣを含む。アクセラレーションライブラリ８１４は、（１つまたは複数の）ハードウェアアクセラレータ８１６とインターフェースするためのＡＰＩを与える。アクセラレーションライブラリ８１４はまた、ニューラルネットワーク層および他のタイプのニューラルネットワーク構造のあらかじめ定義されたおよび最適化された実装形態を含む、ニューラルネットワーク関数を与えるライブラリを含むことができる。したがって、（１つまたは複数の）ニューラルネットワーク８１０は、（１つまたは複数の）ハードウェアアクセラレータ８１６において実装されるハードウェア部分、ならびにアクセラレーションライブラリ８１４において実装されるソフトウェア部分の両方を含むことができる。アプリケーション８１２は、（１つまたは複数の）ニューラルネットワーク８１０を実装するように（１つまたは複数の）ハードウェアアクセラレータ８１６をプログラムし、制御するためにアクセラレーションライブラリ８１４のＡＰＩを起動する。
【００８７】
設計者は、（１つまたは複数の）ニューラルネットワーク８１０を定義するために、（１つまたは複数の）設計ツール８０４と対話する。（１つまたは複数の）設計ツール８０４は、（１つまたは複数の）ハードウェアアクセラレータ８１６をプログラムするためのファイル（たとえば、ＦＰＧＡのための構成ビットストリーム）と、アクセラレーションライブラリ８１４を与えるファイルと、アプリケーション８１２を与えるファイルとを生成することができる。設計者は、レジスタ転送言語（ＲＴＬ）を使用して、あるいは、Ｃ、Ｃ＋＋、ＯｐｅｎＣＬなど、プログラミング言語、またはＲＴＬと（１つまたは複数の）プログラマブル言語との組合せを使用して、（１つまたは複数の）ニューラルネットワーク８１０のハードウェア部分を定義することができる。ユーザは、Ｃ、Ｃ＋＋、ＯｐｅｎＣＬなど、プログラミング言語を使用して、（１つまたは複数の）ニューラルネットワーク８１０のソフトウェア部分を定義することができる。（１つまたは複数の）設計ツール８０４は、（１つまたは複数の）ハードウェアアクセラレータ８１６をプログラムするためのファイルと、アクセラレーションライブラリ８１４のためのライブラリファイルとを生成するために、ソフトウェア定義されたニューラルネットワークをコンパイルする。設計者は、（１つまたは複数の）ニューラルネットワーク８１０のハードウェア部分およびソフトウェア部分を開発するのを支援するために、クラスライブラリ、テンプレートライブラリなどを与えるライブラリ１０６を活用することができる。
【００８８】
ユーザは、プログラミング言語（たとえば、Ｃ、Ｃ＋＋、Ｐｙｔｈｏｎなど）を使用してアプリケーション８１２を定義することができる。ユーザは、Ｃａｆｆｅ、ＴｅｎｓｏｒＦｌｏｗ、ＭＸＮｅｔなど、ニューラルネットワークフレームワークおよびライブラリを活用することができる。
【００８９】
図９は、一例による、コンピューティングシステム８０８を示すブロック図である。コンピューティングシステム８０８は、ハードウェア９０４と、ハードウェア９０４上で実行するソフトウェア９０６とを含む。ハードウェア９０４は、処理システム９１０と、システムメモリ９１６と、ストレージデバイス（「ストレージ９１８」）と、ハードウェアアクセラレータ８１６とを含む。ソフトウェア９０６は、オペレーティングシステム（ＯＳ）９４４と、アクセラレーションライブラリ８１４と、アプリケーション８１２とを含む。
【００９０】
処理システム９１０は、マイクロプロセッサ９１２と、サポート回路９１４と、周辺バス９１５とを含む。マイクロプロセッサ９１２は、ｘ８６ベースプロセッサ、ＡＲＭ（登録商標）ベースプロセッサなど、任意のタイプの汎用中央処理ユニット（ＣＰＵ）であり得る。マイクロプロセッサ９１２は、１つまたは複数のコアと、関連する回路要素（たとえば、キャッシュメモリ、メモリ管理ユニット（ＭＭＵ）、割込みコントローラなど）とを含むことができる。マイクロプロセッサ９１２は、本明細書で説明される１つまたは複数の動作を実施するプログラムコードを実行するように構成され、それらのプログラムコードは、システムメモリ９１６および／またはストレージ９１８に記憶され得る。サポート回路９１４は、マイクロプロセッサ９１２と協働して、マイクロプロセッサ９１２、システムメモリ９１６、ストレージ９１８、ハードウェアアクセラレータ８１６、または任意の他の周辺デバイス間のデータフローを管理する、様々なデバイスを含む。たとえば、サポート回路９１４は、チップセット（たとえば、ノースブリッジ、サウスブリッジ、プラットフォームホストコントローラなど）、電圧調節器、ファームウェア（たとえば、ＢＩＯＳ）などを含むことができる。サポート回路９１４は、マイクロプロセッサ９１２と周辺バス９１５との間のデータフローを管理し、そこにハードウェアアクセラレータ８１６などの様々な周辺機器が接続される。いくつかの例では、マイクロプロセッサ９１２は、チップセット（たとえば、ノースブリッジ、サウスブリッジなど）の機能性の全部または実質的部分を吸収する、システムインパッケージ（ＳｉＰ）、システムオンチップ（ＳｏＣ）などであり得る。周辺バスは、周辺構成要素相互接続エクスプレス（ＰＣＩｅ）など、拡張バス規格を実装することができる。本例では、処理システム９１０は、ハードウェアアクセラレータ８１６とは別個に示されている。以下でさらに説明される他の例では、処理システム９１０とハードウェアアクセラレータ８１６とは、システムオンチップ（ＳｏＣ）を使用して同じＩＣ上に実装され得る。
【００９１】
システムメモリ９１６は、実行可能な命令およびデータなど、情報が記憶され、取り出されることを可能にするデバイスである。システムメモリ９１６は、たとえば、ダブルデータレート（ＤＤＲ）ダイナミックＲＡＭ（ＤＲＡＭ）など、１つまたは複数のランダムアクセスメモリ（ＲＡＭ）モジュールを含むことができる。ストレージデバイス９１８は、ローカルストレージデバイス（たとえば、１つまたは複数のハードディスク、フラッシュメモリモジュール、ソリッドステートディスク、および光ディスク）、および／またはコンピューティングシステム８０８が１つまたは複数のネットワークデータストレージシステムと通信することを可能にするストレージインターフェースを含む。ハードウェア９０４は、グラフィックスカード、ユニバーサルシリアルバス（ＵＳＢ）インターフェースなど、コンピューティングシステムの様々な他の従来のデバイスおよび周辺機器を含むことができる。
【００９２】
ハードウェアアクセラレータ８１６は、プログラマブルＩＣ９２８と、不揮発性メモリ９２４と、ＲＡＭ９２６とを含む。プログラマブルＩＣ９２８は、ＦＰＧＡなど、またはＦＰＧＡを有するＳｏＣなどであり得る。ＮＶＭ９２４は、フラッシュメモリなど、任意のタイプの不揮発性メモリを含むことができる。ＲＡＭ９２６は、ＤＤＲ  ＤＲＡＭなどを含むことができる。プログラマブルＩＣ９２８は、ＮＶＭ９２４およびＲＡＭ９２６に連結される。プログラマブルＩＣ９２８は、処理システム９１０の周辺バス９１５にも連結される。
【００９３】
ＯＳ９４４は、Ｌｉｎｕｘ（登録商標）、Ｍｉｃｒｏｓｏｆｔ  Ｗｉｎｄｏｗｓ（登録商標）、Ｍａｃ  ＯＳ（登録商標）など、当技術分野において知られている任意のコモディティオペレーティングシステムであり得る。アクセラレーションライブラリ８１４は、ハードウェアアクセラレータ８１６のコマンドおよび制御のためのＡＰＩを与えるドライバおよびライブラリを含む。アプリケーション８１２は、（１つまたは複数の）ニューラルネットワークを実装するためにアクセラレーションライブラリ８１４のＡＰＩを起動する、マイクロプロセッサ９１２上で実行するソフトウェアを含む。
【００９４】
動作中、プログラマブルＩＣ９２８はアクセラレーション回路９３０で構成される。一例では、アクセラレーション回路９３０は、図２中のニューラルネットワークアクセラレータ１６５であるが、本明細書の実施形態は、そのようなものに限定されず、他のタイプのニューラルネットワークアクセラレータまたは他のタイプのハードウェアアクセラレータであり得る。アクセラレーション回路９３０は、概して、ベースプラットフォーム９３０Ａとカーネル９３０Ｂとを含む。たとえば、アクセラレーション回路９３０は、静的領域９３４とプログラマブル領域９３６とを使用して実装され得る。静的領域９３４は、周辺バス９１５と、ＮＶＭ９２４と、ＲＡＭ９２６とにインターフェースを与えるためのサポート回路９４０を含む。プログラマブル領域９３６は、１つまたは複数のカーネル回路（「（１つまたは複数の）カーネル９３８」）を含むことができる。ベースプラットフォーム９３０Ａは静的領域９３４を使用して実装され、カーネル９３０Ｂはプログラマブル領域９３６を使用して実装される。別の例では、ベースプラットフォーム９３０Ａはまた、プログラマブル領域９３６の一部分を使用して実装され得る。したがって、いくつかの例では、プログラマブル領域９３６は、いくつかのインターフェース回路をも含む。いくつかの例では、アクセラレーション回路９３０は、それらの各々が個々に（１つまたは複数の）カーネル９３８で構成され得る、２つ以上のプログラマブル領域９３６を含むことができる。
【００９５】
静的領域９３４は、静的領域９３４の回路要素がプログラマブル領域９３６の再構成にわたって不変のままであるという点で「静的」である。一例では、サポート回路９４０は、ＰＣＩｅエンドポイント回路、ダイレクトメモリアクセス（ＤＭＡ）コントローラ、相互接続、メモリコントローラ、メモリインターフェース回路（たとえば、ＤＤＲインターフェース）、（部分再構成をサポートするための）デカップラ回路、フラッシュプログラマー、デバッグ回路などを含む。いくつかの例では、プログラマブル領域９３６は、サポート回路９４０のいずれをも含まない。他の例では、いくつかのサポート回路は、プログラマブル領域９３６において実装される。そのような場合、プログラマブル領域９３６は「拡張されたプログラマブル領域」と呼ばれることがある。いずれの場合も、一例では、ＰＣＩｅ回路およびＤＭＡ回路など、いくつかのサポート回路９４０は、常に、静的領域９３４中に存在する。
【００９６】
図１０は、一例による、アクセラレーション回路９３０を示すブロック図である。アクセラレーション回路９３０は、サポート回路９４０とカーネル９３８とを含む。本例では、サポート回路９４０は、ＰＣＩｅエンドポイント回路（「ＰＣＩｅエンドポイント１００２」）と、ＰＣＩｅ  ＤＭＡコントローラ１００４と、相互接続回路（「相互接続１００６」）と、メモリコントローラ１０１０と、メモリインターフェース１０１２とを含む。サポート回路９４０は、明快のために省略される他の回路（たとえば、デカップラ回路、デバッグ回路など）を含むことができる。ＰＣＩｅエンドポイント１００２は、周辺バス９１５への物理インターフェースを与える。ＰＣＩｅ  ＤＭＡコントローラ１００４は、ＲＡＭ９２６とカーネル９３８とへのＤＭＡ動作を容易にする。相互接続１００６は、ＰＣＩｅ  ＤＭＡコントローラ１００４をメモリコントローラ１０１０とカーネル９３８とに連結する。メモリコントローラ１０１０はメモリインターフェース１０１２に連結される。メモリインターフェース１０１２はＲＡＭ９２６に連結される。
【００９７】
動作中、アクセラレーションライブラリ８１４は、ＰＣＩｅ  ＤＭＡコントローラ１００４を通してＲＡＭ９２６に直接アクセスすることができる。アクセラレーションライブラリ８１４はまた、ＰＣＩｅ  ＤＭＡコントローラ１００４を通してカーネル９３８にアクセスすることができる。カーネル９３８は、メモリコントローラ１０１０を通してＲＡＭ９２６にアクセスすることができる。データは、システムメモリ９１６とＲＡＭ９２６との間のＤＭＡ動作を使用して、ソフトウェア９０６とカーネル９３８との間で交換され得る。
【００９８】
本例では、カーネル９３８は、相互接続１００６と通信するためにインターフェース１０３０、１０３１、および１０３２を使用する。特に、これらのインターフェースは、第１の読取りインターフェース１０３０と、第２の読取りインターフェース１０３１と、読取り／書込みインターフェース１０３２とを含み得る。たとえば、読取りインターフェース１０３０は、カーネル９３８を制御するための制御インターフェースとして使用され得る。読取りインターフェース１０３１は、メモリインターフェース１０１２のうちの第１のメモリインターフェースを通してＲＡＭ９２６から読み取るために使用され得る。読取り／書込みインターフェース１０３２は、メモリインターフェース１０１２のうちの第２のメモリインターフェースを通してＲＡＭ９２６からの読取りおよび書込みを行うために使用され得る。
【００９９】
カーネル９３８は、相互接続インターフェース１００４と、制御論理１０４２と、処理回路１０４１とを含む。処理回路１０４１は、ＩＭ２ＣＯＬ回路（「ＩＭ２ＣＯＬ１０４４」）と、読取り制御回路（「読取り制御１０４６」）と、マルチプレクサ１０５６と、先入れ先出し回路（「ＦＩＦＯ１０５８」）と、算出アレイ１０６２と、スケーラ回路（「スケーラ１０６４」）と、最大プール回路（「最大プール１０６６」）と、マルチプレクサ１０６８と、ＦＩＦＯ１０５４と、書込み制御回路（「書込み制御１０５２」）と、キャッシュ１０４８と、読取り制御回路（「読取り制御１０５０」）と、ＦＩＦＯ１０６０とを含む。相互接続インターフェース１０４０は、インターフェース１０３０、１０３１、および１０３２と、制御論理１０４２と、処理回路１０４１とに連結される。相互接続インターフェース１０４０は、制御論理１０４２とインターフェース１０３０との間の通信、ならびに処理回路１０４１とインターフェース１０３１および１０３２との間の通信を容易にするための、スイッチ、クロック変換器などを含むことができる。
【０１００】
本例では、相互接続インターフェース１０４０は、ＩＭ２ＣＯＬ回路１０４４の入力と、読取り制御回路１０４６の入力と、キャッシュ１０４８の入力と、書込み制御回路１０５２の入力とに連結される。ＩＭ２ＣＯＬ回路１０４４の出力と、読取り制御回路１０４６の出力とが、マルチプレクサ１０５６の入力に連結される。マルチプレクサ１０５６の出力がＦＩＦＯ１０５６の入力に連結される。ＦＩＦＯ１０５６の出力が算出アレイ１０６２の第１の入力に連結される。キャッシュ１０４８の出力が読取り制御回路１０５０の入力に連結される。読取り制御回路１０５０の出力がＦＩＦＯ１０６０の入力に連結される。ＦＩＦＯ１０６０の出力が算出アレイ１０６２の第２の入力に連結される。算出アレイ１０６２の出力がスケーラ１０６４の入力に連結される。スケーラ１０６４の出力が、最大プール回路１０６６の入力とマルチプレクサ１０６８の入力とに連結される。最大プール回路１０６６の出力がマルチプレクサ１０６８の別の入力に連結される。マルチプレクサ１０６８の出力がＦＩＦＯ１０５４の入力に連結される。ＦＩＦＯ１０５４の出力が書込み制御回路１０５２に連結される。
【０１０１】
動作中、算出アレイ１０６２は、ニューラルネットワークを実装するための行列乗算動作を実施する。算出アレイ１０６２の入力は、ＦＩＦＯ１０５８から入力活性化行列を受信し、ＦＩＦＯ１０６０から重み行列を受信する。入力活性化行列は、読取り制御回路１０４６を使用してＲＡＭ９２６から直接読み取られ得る。代替的に、入力活性化はＲＡＭ９２６から読み取られ、算出アレイ１０６２への入力のためにＩＭ２ＣＯＬ回路１０４４によって処理され得る。ＩＭ２ＣＯＬ回路１０４４の実施形態が以下で説明される。重み行列は、読取り制御回路１０５０によってＲＡＭ９２６から読み取られ、キャッシュ１０４８中にキャッシュされ得る。スケーラ１０６４は、算出アレイ１０６２の出力をスケーリングし得る。最大プール回路１０６６は、算出アレイ１０６２のスケーリングされた出力に対する最大プーリング関数を実装することができる。一例では、最大プール回路１０６６は、構成可能な論理ブロック（ＣＬＢ）または他の構成可能な論理を使用して実装される。最大プール回路１０６６の出力またはスケーラ１０６４の出力のいずれかがＦＩＦＯ１０５４に記憶され得る。書込み制御回路１０５２は、ＦＩＦＯ中のデータをＲＡＭ９２６に書き込む。制御論理１０４２は、ＩＭ２ＣＯＬ回路１０４４、読取り制御回路１０４６、マルチプレクサ１０５６および１０６８、読取り制御回路１０５０、ならびにスケーラ１０６４、最大プール回路１０６６、ならびに書込み制御回路１０５２など、処理回路１０４１中の様々な回路を制御する。
【０１０２】
図１１は、一例による、プログラマブルＩＣ９２８を示すブロック図である。プログラマブルＩＣ９２８は、プログラマブル論理３と、構成論理２５と、構成メモリ２６とを含む。プログラマブルＩＣ９２８は、ＮＶＭ９２４、ＲＡＭ９２６、および他の回路２９など、外部回路に連結され得る。プログラマブル論理３は、論理セル３０と、サポート回路３１と、プログラマブル相互接続３２とを含む。論理セル３０は、複数の入力の一般的な論理関数を実装するように構成され得る回路を含む。サポート回路３１は、トランシーバ、入出力ブロック、デジタル信号プロセッサ、メモリなどの専用回路を含む。論理セルとサポート回路３１とは、プログラマブル相互接続３２を使用して相互接続され得る。論理セル３０をプログラムするための情報と、サポート回路３１のパラメータを設定するための情報と、プログラマブル相互接続３２をプログラムするための情報とが、構成論理２５によって構成メモリ２６に記憶される。構成論理２５は、不揮発性メモリ９２４または任意の他のソース（たとえば、ＤＲＡＭ２８または他の回路２９）から構成データを取得することができる。いくつかの例では、プログラマブルＩＣ９２８は処理システム２を含む。処理システム２は、（１つまたは複数の）マイクロプロセッサ、メモリ、サポート回路、ＩＯ回路などを含むことができる。たとえば、処理システム２は、処理システム９１０と同様の回路を含むことができる。いくつかの例では、処理システム２は、処理システム９１０の代わりに使用され得る。そのような場合、コンピューティングシステム８０８全体がプログラマブルＩＣ９２８を使用して実装され得、ソフトウェア９０６は処理システム２上で実行する。
【０１０３】
図１２は、トランシーバ３７、ＣＬＢ３３、ＢＲＡＭ３４、入出力ブロック（「ＩＯＢ」）３６、構成およびクロッキング論理（「ＣＯＮＦＩＧ／ＣＬＯＣＫＳ」）４２、ＤＳＰ３５、特殊な入出力ブロック（「Ｉ／Ｏ」）４１（たとえば、構成ポートおよびクロックポート）、ならびにデジタルクロックマネージャ、アナログデジタル変換器、システム監視論理などの他のプログラマブル論理３９を含む、多数の異なるプログラマブルタイルを含むプログラマブルＩＣ９２８のＦＰＧＡ実装形態を示す。ＦＰＧＡはまた、ＰＣＩｅインターフェース４０、アナログデジタル変換器（ＡＤＣ）３８などを含むことができる。
【０１０４】
いくつかのＦＰＧＡでは、各プログラマブルタイルは、図１２の上部に含まれる例によって示されているように、同じタイル内のプログラマブル論理要素の入力および出力端子４８への接続を有する少なくとも１つのプログラマブル相互接続要素（「ＩＮＴ」）４３を含むことができる。各プログラマブル相互接続要素４３は、同じタイルまたは（１つまたは複数の）他のタイル中の（１つまたは複数の）隣接するプログラマブル相互接続要素の相互接続セグメント４９への接続をも含むことができる。各プログラマブル相互接続要素４３は、論理ブロック（図示せず）間の一般的なルーティングリソースの相互接続セグメント５０への接続をも含むことができる。一般的なルーティングリソースは、相互接続セグメント（たとえば、相互接続セグメント５０）のトラックを備える論理ブロック（図示せず）と、相互接続セグメントを接続するためのスイッチブロック（図示せず）との間のルーティングチャネルを含むことができる。一般的なルーティングリソースの相互接続セグメント（たとえば、相互接続セグメント５０）は、１つまたは複数の論理ブロックにわたることができる。一般的なルーティングリソースとともにとられるプログラマブル相互接続要素４３は、示されているＦＰＧＡのためのプログラマブル相互接続構造（「プログラマブル相互接続」）を実装する。
【０１０５】
例示的な一実装形態では、ＣＬＢ３３は、ユーザ論理を実装するようにプログラムされ得る構成可能論理要素（「ＣＬＥ」）４４と、単一のプログラマブル相互接続要素（「ＩＮＴ」）４３とを含むことができる。ＢＲＡＭ３４は、１つまたは複数のプログラマブル相互接続要素に加えてＢＲＡＭ論理要素（「ＢＲＬ」）４５を含むことができる。典型的には、タイル中に含まれる相互接続要素の数は、タイルの高さに依存する。描かれている例では、ＢＲＡＭタイルは、５つのＣＬＢと同じ高さを有するが、他の数（たとえば、４つ）も使用され得る。ＤＳＰタイル３５は、適切な数のプログラマブル相互接続要素に加えてＤＳＰ論理要素（「ＤＳＰＬ」）４６を含むことができる。ＩＯＢ３６は、たとえば、プログラマブル相互接続要素４３の１つのインスタンスに加えて入出力論理要素（「ＩＯＬ」）４７の２つのインスタンスを含むことができる。当業者に明らかになるように、たとえばＩ／Ｏ論理要素４７に接続される実際のＩ／Ｏパッドは、典型的に、入出力論理要素４７のエリアに制限されない。
【０１０６】
描かれている例では、（図１２に示されている）ダイの中心の近くの水平方向のエリアが、構成、クロック、および他の制御論理のために使用される。この水平方向のエリアまたは列から延びる垂直方向の列５１が、ＦＰＧＡの幅にわたってクロックおよび構成信号を分散させるために使用される。
【０１０７】
図１２に示されているアーキテクチャを利用するいくつかのＦＰＧＡは、ＦＰＧＡの大部分を構築する規則的な列状構造を損なう追加の論理ブロックを含む。追加の論理ブロックは、プログラマブルブロックおよび／または専用の論理であり得る。
【０１０８】
図１２は、例示的なＦＰＧＡアーキテクチャを示すことを意図されているにすぎないことに留意されたい。たとえば、１つの行中の論理ブロックの数、行の相対幅、行の数および順序、行中に含まれる論理ブロックのタイプ、論理ブロックの相対サイズ、および図１２の上部に含まれる相互接続／論理実装形態は、例にすぎない。たとえば、実際のＦＰＧＡでは、ユーザ論理の効率的な実装を容易にするために、ＣＬＢが現れるところならどこでも、ＣＬＢの２つ以上の隣接する行が典型的に含まれるが、隣接するＣＬＢ行の数は、ＦＰＧＡの全体的なサイズによって変動する。
【０１０９】
上記では、本開示において提示される実施形態への言及が行われた。しかしながら、本開示の範囲は、特定の説明される実施形態に限定されない。代わりに、本明細書で説明される特徴および要素の任意の組合せが、異なる実施形態に関係するか否かにかかわらず、企図された実施形態を実装および実施するために企図される。さらに、本明細書で開示される実施形態は、他の可能な解決策または従来技術に勝る利点を達成し得るが、特定の利点が所与の実施形態によって達成されるか否かは、本開示の範囲を限定するものではない。したがって、本明細書で説明される態様、特徴、実施形態および利点は、例示的なものにすぎず、（１つまたは複数の）請求項において明示的に具陳されている場合を除いて、添付の特許請求の範囲の要素または限定と見なされない。同様に、「本発明」への言及は、本明細書で開示される発明の主題の一般化と解釈されるものではなく、（１つまたは複数の）請求項において明示的に具陳されている場合を除いて、添付の特許請求の範囲の要素または限定であると見なされるものではない。
【０１１０】
本明細書で説明される態様は、完全にハードウェアの実施形態、（ファームウェア、常駐ソフトウェア、マイクロコードなどを含む）完全にソフトウェアの実施形態、またはソフトウェア態様とハードウェア態様とを組み合わせる実施形態の形態をとり得、これらはすべて、本明細書では概して「モジュール」または「システム」と呼ばれることがある。
【０１１１】
本発明は、システム、方法、および／またはコンピュータプログラム製品であり得る。コンピュータプログラム製品は、プロセッサに本発明の態様を行わせるためのコンピュータ可読プログラム命令をその上に有する（１つまたは複数の）コンピュータ可読記憶媒体を含み得る。
【０１１２】
コンピュータ可読記憶媒体は、命令実行デバイスによる使用のための命令を保持および記憶することができる有形デバイスであり得る。コンピュータ可読記憶媒体は、たとえば、限定はしないが、電子ストレージデバイス、磁気ストレージデバイス、光ストレージデバイス、電磁ストレージデバイス、半導体ストレージデバイス、または上記の任意の好適な組合せであり得る。コンピュータ可読記憶媒体のより具体的な例の非網羅的なリストは、ポータブルコンピュータディスケット、ハードディスク、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、消去可能プログラマブル読取り専用メモリ（ＥＰＲＯＭまたはフラッシュメモリ）、スタティックランダムアクセスメモリ（ＳＲＡＭ）、ポータブルコンパクトディスク読取り専用メモリ（ＣＤ−ＲＯＭ）、デジタル多用途ディスク（ＤＶＤ）、メモリスティック、フロッピーディスク、パンチカードまたは命令が記録された溝における隆起構造など、機械的に符号化されたデバイス、および上記の任意の好適な組合せを含む。本明細書で使用されるコンピュータ可読記憶媒体は、電波または他の自由に伝搬する電磁波、導波路または他の伝送媒体中を伝搬する電磁波（たとえば、光ファイバーケーブルを通過する光パルス）、あるいはワイヤを通して送信される電気信号など、それ自体が一時的信号であると解釈されるべきではない。
【０１１３】
本明細書で説明されるコンピュータ可読プログラム命令は、コンピュータ可読記憶媒体からそれぞれのコンピューティング／処理デバイスに、あるいはネットワーク、たとえば、インターネット、ローカルエリアネットワーク、ワイドエリアネットワークおよび／またはワイヤレスネットワークを介して外部コンピュータまたは外部ストレージデバイスにダウンロードされ得る。ネットワークは、銅伝送ケーブル、光伝送ファイバー、ワイヤレス送信、ルータ、ファイアウォール、スイッチ、ゲートウェイコンピュータおよび／またはエッジサーバを備え得る。各コンピューティング／処理デバイス中のネットワークアダプタカードまたはネットワークインターフェースは、ネットワークからコンピュータ可読プログラム命令を受信し、そのコンピュータ可読プログラム命令を、それぞれのコンピューティング／処理デバイス内のコンピュータ可読記憶媒体に記憶するためにフォワーディングする。
【０１１４】
本発明の動作を行うためのコンピュータ可読プログラム命令は、アセンブラ命令、命令セットアーキテクチャ（ＩＳＡ）命令、機械命令、機械依存命令、マイクロコード、ファームウェア命令、状態設定データ、あるいは、Ｓｍａｌｌｔａｌｋ、Ｃ＋＋などのオブジェクト指向プログラミング言語、および「Ｃ」プログラミング言語または同様のプログラミング言語などの従来の手続き型プログラミング言語を含む１つまたは複数のプログラミング言語の任意の組合せで書き込まれたソースコードまたはオブジェクトコードのいずれかであり得る。コンピュータ可読プログラム命令は、完全にユーザのコンピュータ上で、部分的にユーザのコンピュータ上で、スタンドアロンソフトウェアパッケージとして、部分的にユーザのコンピュータ上でおよび部分的にリモートコンピュータ上で、あるいは完全にリモートコンピュータまたはサーバ上で実行し得る。後者のシナリオでは、リモートコンピュータは、ローカルエリアネットワーク（ＬＡＮ）またはワイドエリアネットワーク（ＷＡＮ）を含む任意のタイプのネットワークを通してユーザのコンピュータに接続され得るか、あるいは接続は、（たとえば、インターネットサービスプロバイダを使用してインターネットを通して）外部コンピュータに対して行われ得る。いくつかの実施形態では、たとえば、プログラマブル論理回路要素、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、またはプログラマブル論理アレイ（ＰＬＡ）を含む電子回路要素が、本発明の態様を実施するために、電子回路要素を個人化するためにコンピュータ可読プログラム命令の状態情報を利用することによって、コンピュータ可読プログラム命令を実行し得る。
【０１１５】
本発明の態様が、本発明の実施形態による方法、装置（システム）、およびコンピュータプログラム製品のフローチャートの例示図および／またはブロック図を参照しながら本明細書で説明された。フローチャートの例示図および／またはブロック図の各ブロック、ならびにフローチャートの例示図および／またはブロック図中のブロックの組合せが、コンピュータ可読プログラム命令によって実装され得ることを理解されよう。
【０１１６】
これらのコンピュータ可読プログラム命令は、汎用コンピュータ、専用コンピュータ、または機械を製造するための他のプログラマブルデータ処理装置のプロセッサに与えられ得、その結果、コンピュータまたは他のプログラマブルデータ処理装置のプロセッサを介して実行する命令は、フローチャートおよび／またはブロック図の１つまたは複数のブロックにおいて指定された関数／行為を実装するための手段を作成する。これらのコンピュータ可読プログラム命令はまた、コンピュータ、プログラマブルデータ処理装置、および／または他のデバイスに特定の様式で機能するように指示することができるコンピュータ可読記憶媒体に記憶され得、その結果、命令が記憶されたコンピュータ可読記憶媒体は、フローチャートおよび／またはブロック図の１つまたは複数のブロックにおいて指定された関数／行為の態様を実装する命令を含む製造品を備える。
【０１１７】
コンピュータ可読プログラム命令はまた、コンピュータ実装プロセスを作り出すために、一連の動作ステップをコンピュータ、他のプログラマブルデータ処理装置または他のデバイス上で実施させるように、コンピュータ、他のプログラマブル装置、または他のデバイスにロードされ得、その結果、コンピュータ、他のプログラマブル装置、または他のデバイス上で実行する命令は、フローチャートおよび／またはブロック図の１つまたは複数のブロックにおいて指定された関数／行為を実装する。
【０１１８】
図中のフローチャートおよびブロック図は、本発明の様々な実施形態によるシステム、方法、およびコンピュータプログラム製品の可能な実装形態のアーキテクチャ、機能性、および動作を示す。この点について、フローチャートまたはブロック図中の各ブロックは、（１つまたは複数の）指定された論理関数を実装するための１つまたは複数の実行可能な命令を備える、命令のモジュール、セグメント、または部分を表し得る。いくつかの代替実装形態では、ブロック中で言及される関数は、図中で言及される順序から外れて行われ得る。たとえば、関与する機能性に応じて、連続して示されている２つのブロックが、事実上、実質的にコンカレントに実行され得るか、またはブロックが、時々、逆の順序で実行され得る。また、ブロック図および／またはフローチャートの例示図の各ブロック、ならびにブロック図および／またはフローチャートの例示図中のブロックの組合せが、指定された関数または行為を実施するかあるいは専用ハードウェアとコンピュータ命令との組合せを行う専用ハードウェアベースシステムによって実装され得ることに留意されたい。
【０１１９】
上記は特定の例を対象とするが、他のおよびさらなる例がその基本的範囲から逸脱することなく考案され得、その範囲は以下の特許請求の範囲によって決定される。
【図１】
2020537784.tif 000003
【図２】
2020537784.tif 000004
【図３】
2020537784.tif 000005
【図４】
2020537784.tif 000006
【図５】
2020537784.tif 000007
【図６】
2020537784.tif 000008
【図７】
2020537784.tif 000009
【図８】
2020537784.tif 000010
【図９】
2020537784.tif 000011
【図１０】
2020537784.tif 000012
【図１１】
2020537784.tif 000013
【図１２】
2020537784.tif 000014
【手続補正書】
【提出日】令和1年11月14日(2019.11.14)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
ニューラルネットワークアクセラレータにサブミットされるタスクをパイプライン化するためのコンピュータ実装方法であって、前記方法は、
ホスト上で実行するライブラリにおいて、ニューラルネットワークアプリケーションから、前記ニューラルネットワークアクセラレータによって処理されるべき複数のタスクを受信することと、
１つまたは複数のコンピュータプロセッサを使用して、前記ライブラリにおけるパイプライン中の複数のステージによって使用される情報を含んでいる、前記複数のタスクの各々についてのそれぞれのパケットを生成することであって、前記ライブラリが、前記ニューラルネットワークアプリケーションと前記ニューラルネットワークアクセラレータを実行するハードウェアシステムとの間のアダプタである、それぞれのパケットを生成することと、
前記複数のステージのうちの異なるステージにおいて前記それぞれのパケットを並列に処理することであって、前記複数のステージのうちの少なくとも１つが、前記ニューラルネットワークアクセラレータを実行する前記ハードウェアシステムへの呼出しを実施する、前記それぞれのパケットを並列に処理することと、
前記パイプラインを使用して前記パケットを処理した結果を前記ニューラルネットワークアプリケーションに返すことと
を含む、コンピュータ実装方法。
【請求項２】
前記複数のステージにおいて前記パケットを処理することは、
前処理ステージにおいて前記パケットを処理することと、
前記前処理ステージの後に行われる実行ステージにおいて前記パケットを処理することであって、前記ハードウェアシステムへの前記呼出しが、前記実行ステージ中に行われる、実行ステージにおいて前記パケットを処理することと、
前記実行ステージの後の後処理ステージにおいて前記パケットを処理することと
を含む、請求項１に記載の方法。
【請求項３】
前記前処理ステージにおいて前記パケットを処理することが、
前記第１のタスクに対応するデータを、前記ニューラルネットワークアプリケーションによって使用される第１のフォーマットから、前記ハードウェアシステムによって使用される第２のフォーマットに変換すること
を含み、
前記後処理ステージにおいて前記パケットを処理することが、前記結果を前記第２のフォーマットから前記第１のフォーマットに変換することを含む、請求項２に記載の方法。
【請求項４】
前記複数のステージの各々が、他のスレッドから独立して前記パケットを処理するそれぞれのスレッドを含む、請求項１に記載の方法。
【請求項５】
前記ニューラルネットワークアプリケーションのためのメモリの割り当てブロックを、前記ハードウェアシステム中の前記ニューラルネットワークアクセラレータのためのメモリの割り当てブロックにマッピングするメモリマップを生成することと、
前記メモリマップに基づいて前記ニューラルネットワークアプリケーションから受信された第１のメモリアドレスを、前記ハードウェアシステム中のメモリブロックのための第２のメモリアドレスに変換することと
をさらに含む、請求項１に記載の方法。
【請求項６】
ニューラルネットワークの複数の層を実施するために使用される重みを、行列フォーマットにおいて前記ハードウェアシステムに転送することと、
新しいタスクに対応する前記重みのサブセットを識別することと、
前記パケットを処理するときに使用されるべきである前記重みの前記サブセットを示すオフセットを前記ハードウェアシステムに送信することと
をさらに含む、請求項１に記載の方法。
【請求項７】
前記ハードウェアシステム上の前記ニューラルネットワークアクセラレータの実行に関するメトリックを取得することと、
表示のために前記メトリックの視覚表現を出力することと、
前記ニューラルネットワークアクセラレータの利用率を増加させるように、前記パイプライン中の前記複数のステージを実行するハードウェアリソースを調整することと
をさらに含む、請求項１に記載の方法。
【請求項８】
前記パイプライン中の前記複数のステージが前記ライブラリにおいて定義され、前記ライブラリは、異なるタイプのニューラルネットワークアプリケーションがタスクを前記ニューラルネットワークアクセラレータにサブミットするために前記パイプライン中の前記複数のステージを使用することを可能にするように構成されたアプリケーションプログラムインターフェース（ＡＰＩ）を含む、請求項１に記載の方法。
【請求項９】
プロセッサと、
ニューラルネットワークアプリケーションとニューラルネットワークアクセラレータを実行するハードウェアシステムとの間のアダプタであるライブラリを備えるメモリと
を備えるコンピューティングシステムであって、前記ライブラリは、前記プロセッサによって実行されたとき、
ニューラルネットワークアプリケーションから、ニューラルネットワークアクセラレータによって処理されるべき複数のタスクを受信することと、
１つまたは複数のコンピュータプロセッサを使用して、パイプライン中の複数のステージによって使用される情報を含んでいる、前記複数のタスクの各々についてのそれぞれのパケットを生成することと、
前記複数のステージのうちの異なるステージにおいて前記それぞれのパケットを並列に処理することであって、前記複数のステージのうちの少なくとも１つが、前記ニューラルネットワークアクセラレータを実行する前記ハードウェアシステムへの呼出しを実施する、前記それぞれのパケットを並列に処理することと、
前記パイプラインを使用して前記パケットを処理した結果を前記ニューラルネットワークアプリケーションに返すことと
を含む動作を実施する、コンピューティングシステム。
【請求項１０】
前記複数のステージにおいて前記パケットを処理することは、
前処理ステージにおいて前記パケットを処理することと、
前記前処理ステージの後に行われる実行ステージにおいて前記パケットを処理することであって、前記ハードウェアシステムへの前記呼出しが、前記実行ステージ中に行われる、実行ステージにおいて前記パケットを処理することと、
前記実行ステージの後の後処理ステージにおいて前記パケットを処理することと
を含む、請求項９に記載のコンピューティングシステム。
【請求項１１】
前記前処理ステージにおいて前記パケットを処理することが、
前記第１のタスクに対応するデータを、前記ニューラルネットワークアプリケーションによって使用される第１のフォーマットから、前記ハードウェアシステムによって使用される第２のフォーマットに変換すること
を含み、
前記後処理ステージにおいて前記パケットを処理することが、前記結果を前記第２のフォーマットから前記第１のフォーマットに変換することを含む、請求項１０に記載のコンピューティングシステム。
【請求項１２】
前記動作が、
前記ニューラルネットワークアプリケーションのためのメモリの割り当てブロックを、前記ハードウェアシステム中の前記ニューラルネットワークアクセラレータのためのメモリの割り当てブロックにマッピングするメモリマップを生成することと、
前記メモリマップに基づいて前記ニューラルネットワークアプリケーションから受信された第１のメモリアドレスを、前記ハードウェアシステム中のメモリブロックのための第２のメモリアドレスに変換することと
をさらに含む、請求項９に記載のコンピューティングシステム。
【請求項１３】
前記動作が、
ニューラルネットワークの複数の層を実施するために使用される重みを、行列フォーマットにおいて前記ハードウェアシステムに転送することと、
新しいタスクに対応する前記重みのサブセットを識別することと、
前記パケットを処理するときに使用されるべきである前記重みの前記サブセットを示すオフセットを前記ハードウェアシステムに送信することと
をさらに含む、請求項９に記載のコンピューティングシステム。
【請求項１４】
前記動作が、
前記ハードウェアシステム上の前記ニューラルネットワークアクセラレータの実行に関するメトリックを取得することと、
表示のために前記メトリックの視覚表現を出力することと、
前記ニューラルネットワークアクセラレータの利用率を増加させるように、前記パイプライン中の前記複数のステージを実行するハードウェアリソースを調整することと
をさらに含む、請求項９に記載のコンピューティングシステム。
【請求項１５】
前記パイプライン中の前記複数のステージが前記ライブラリにおいて定義され、前記ライブラリは、異なるタイプのニューラルネットワークアプリケーションがタスクを前記ニューラルネットワークアクセラレータにサブミットするために前記パイプライン中の前記複数のステージを使用することを可能にするように構成されたＡＰＩを含む、請求項９に記載のコンピューティングシステム。
【国際調査報告】
2020537784.tif 000015
2020537784.tif 000016
2020537784.tif 000017
2020537784.tif 000018
2020537784.tif 000019