Spiralsスクリプトの目的は、コンピューターで生成された画像を作成することです。画像は、CUDAサポートを使用してGPUにマップします。
以下は、Pythonスクリプトで作成された画像の例です。それらの構成の詳細は、他の例とともに例フォルダーにあります。
Pythonスクリプトを実行するには、次の依存関係をインストールする必要があります。
Intel I7-9700Kで順番に実行されると、各画像には約23.5877081秒かかります。
CGIアルゴリズムを最適化するための最初のステップは、GPUでの並列使用のためにアルゴリズムを再構築することでした。これは、 @cuda.jitデコレータを使用して行われました。これには、カーネルの呼び出しが必要です。アルゴリズムが実行される前に、コードはGPUハードウェアにピクセル配列をマッピングする方法を決定します。アルゴリズムでは、各ピクセルを計算するループはi, j = cuda.grid(2)に置き換えられます。 iとj画像の境界内にある場合、関数はインデックスのピクセル色を計算します。ループなし。並列化のスピードアップは約1,072で、約22.1124ミリ秒かかります。
nvprof CLIツール(Optimizations.txt)によると、 [CUDA memcpy HtoD]実行の約36.09%を占めています。これをバイパスするために、CPU側のメモリに追加されることなく、ピクセル配列をデバイスに作成および初期化できます。 numba.cuda 、それを行うための関数device_arrayを提供します。ホストからデバイスへの転送を最小化するスピードアップは約1.38で、約15.9563ミリ秒かかります。
次の最適化では、共有メモリ、スレッドのブロックが共有するメモリを使用します。メモリはブロック固有であるため、読み取り速度が高速になります。したがって、メモリアクセス操作は、共有メモリで計算できます。次の操作では、グローバルピクセルアレイへの1つの遅いアクセスが並列化された計算を完了します。共有メモリ使用量のスピードアップは約1.068で、約14.9425ミリ秒かかります。
CPUアルゴリズムから最適化されたGPUアルゴリズムまでの合計スピードアップは、約1,578です。