3

呼び出し:

cudaExtent extent = make_cudaExtent( 1920 * sizeof(float), 1080, 10);
chanDesc = cudaCreateChannelDesc ( 32, 0, 0, 0, cudaChannelFormatKindFloat);
err = cudaMalloc3DArray  ( &(devYAll[0]), &chanDesc, extent, 0); 

で失敗していerr=cudaErrorInvalidValueます。最初の引数を1024以下の範囲で使用すると、3D配列の呼び出しは成功します。割り当て可能なメモリのサイズに何らかの制限はありcudaMalloc3DArrayますか?

4

1 に答える 1

4

はい、エクステントサイズに制限があります.2048x2048x2048または4096x4096x4096のいずれかで、使用しているハードウェアに応じて異なります(質問の詳細から、Fermiカードを持っていると思います)。しかし、あなたの問題の本当の原因はあなたのmake_cudaExtent電話です。の場合cudaMalloc3DArray、extent の最初の引数は、バイト単位ではなく、要素単位で指定する必要があります。これが、Fermi GPU の制限である 1024 * sizeof(float) = 4096 のように、最初の次元 > 1024 でエラーが発生する理由です。

1920x1080x10 の 3D 配列を割り当てるには、次のようにします。

cudaExtent extent = make_cudaExtent( 1920, 1080, 10);
chanDesc = cudaCreateChannelDesc ( 32, 0, 0, 0, cudaChannelFormatKindFloat);
err = cudaMalloc3DArray  ( &(devYAll[0]), &chanDesc, extent, 0); 

この呼び出しでは、タイプのサイズがチャネル記述から推定され、ハードウェアのピッチ/アライメント要件を満たすために、必要に応じてエクステント ディメンションが変更されます。

于 2013-02-05T19:10:09.867 に答える