単純な関数の積分を計算するプログラムを作成しました。テストしたところ、要素数が 1000 万を超えるサイズの配列を使用すると、間違った答えが返されることがわかりました。配列が CUDA カーネルで操作されると、エラーが発生しているように見えることがわかりました。1,000 万以下の要素は正常に機能し、正しい結果が得られました。
GPU に転送できる、または GPU で計算できる要素の量にサイズ制限はありますか?
フロートを含む C スタイルの配列を使用する PS。
単純な関数の積分を計算するプログラムを作成しました。テストしたところ、要素数が 1000 万を超えるサイズの配列を使用すると、間違った答えが返されることがわかりました。配列が CUDA カーネルで操作されると、エラーが発生しているように見えることがわかりました。1,000 万以下の要素は正常に機能し、正しい結果が得られました。
GPU に転送できる、または GPU で計算できる要素の量にサイズ制限はありますか?
フロートを含む C スタイルの配列を使用する PS。
CUDAで使用できるメモリにはさまざまな種類があります。特に、あなたは
cuMemAlloc
)cuMemHostAlloc
)cuMemAllocHost
)cuMemAllocPitch
)各種類のメモリは、独自のハードウェアリソース制限に関連付けられており、その多くはを使用して見つけることができますcuDeviceGetAttribute
。この関数cuMemGetInfo
は、デバイスの空きメモリと合計メモリの量を返しますが、アライメント要件のため、floatを割り当てると、バイト1,000,000
以上が消費される可能性があります。1,000,000 * sizeof(float)
一度にスケジュールできるブロックの最大数も制限です。それを超えると、カーネルの起動に失敗します(この数はを使用して簡単に見つけることができますcuDeviceGetAttribute
)。CUDA Driver APIを使用して、さまざまな量のメモリのアライメント要件を見つけることができますが、単純なプログラムの場合、合理的な推測を行い、割り当て関数の値をチェックして、割り当てが成功したかどうかを判断できます。
転送できるバイト数に制限はありません。非同期関数を使用すると、カーネルの実行をメモリのコピーとオーバーラップさせることができます(カードがこれをサポートしている場合)。スケジュールできるブロックの最大数を超えたり、デバイスで使用可能なメモリを消費したりすると、タスクを分割して、複数のカーネルを使用して処理できるようにする必要があります。