1

私はOSEMアルゴリズムを実装しようとしています(楽しみのためだけでなく、実行する必要があるために実行しようとしています)。質問があります。

非常に大きな行列を扱うので、mallocで割り当てることができる最大配列サイズ(C言語)を知りたいです。私が読んだ内容は、OSとハードウェアによって異なります。IntelXeonE5530 2.40 Ghz、Red Had Enterprise 64ビット、Nvidia QuadroFX3800に取り組んでいます。

使用する行列は、float /double2000x1000x20のような次元になります。

これらの行列がCUDACで機能することを考えると、次のように1D配列に行列を割り当てる必要があります。

float*matrix=(float*)malloc(sizeof(float)*2000*1000*20));

前もって感謝します ;)

4

4 に答える 4

6

これらの割り当ては比較的小さく、float の場合は約 160 MB、double の場合は 320 MB です。これらのマトリックスが同時に多数ある場合を除き、問題はないはずです。

主な制限は CUDA であり、GPU カードの物理メモリの総量によって制限される可能性がありますが、これらのマトリックスがかなりの数ない限り、現在の CUDA 互換 GPU カードで問題ありません。 .

于 2011-03-21T13:45:37.140 に答える
0

理論的には、64 ビット システムで割り当てることができる最大のバッファは 2 64であり、これは 2000x1000x20 配列よりもはるかに大きくなります。また、コンピューターで処理できるすべてのメモリよりもはるかに大きくなります。

32 ビット システムでは通常 2GB です。(一部のシステムでは 3 GB または 4 GB が許可されています。) これは 2.1 * 10 9バイトです。はsizeof(float)4 バイトです。見てみましょう、あなたは持っています:

2000 * 1000 * 20 = 4 * 10 7

それに float のサイズを掛けると、次のようになります。

4 * 10 7 * 4 = 1.6 * 10 8

1.6*10 8は非常に印象的な数値ですが、32 ビット システムではそれだけの量のメモリを割り当てることもできます。

私はそれについて心配しません。

于 2011-03-21T13:44:08.147 に答える
0

その他の考慮事項を次に示します。

  • GPU メモリを飽和させる可能性のある複数の画像が必要でない限り、行列のサイズが大きくても心配する必要はありません。

  • 毎回小さなセットで画像を処理できる場合は、AsyncAPIを使用してアップロード/処理/ダウンロードしてください。最初の結果を計算している間に、次の画像をアップロードできます。

  • CudaMallocHost、ページング不可能なメモリ、つまりはるかに高速なデータ転送を試してください

  • より多くのメモリを消費する場合でも、デバイスでPitched Memoryを試してみると、アクセス パフォーマンスが向上します。

  • 最後になりましたが、より良いカードを入手してください。たとえば、 Gtx 460を使用すると、360 コアを約 200 ドルで入手できます。

于 2011-03-27T20:22:27.897 に答える
-1

使用できる配列の最大サイズ (つまり、この場合に使用して割り当てることができるメモリの最大量malloc) は、C 言語自体の何によっても制限されません。マシンで使用可能なメモリの量に完全に依存します。

于 2011-03-21T13:45:48.010 に答える