1

私は次のように簡単なCUDAコードを書きました:

//Allocate the first 2d array "deviceArray2DInput"
if(cudaMallocPitch((Float32**) &deviceArray2DInput, &devicePitch, sizeof(Float32)*deviceColNumber,deviceRowNumber) == cudaErrorMemoryAllocation){
    return -1;
}

//Allocate the second 2d array "deviceArray2DOutput". It was suppose to hold the output of some process.
if(cudaMallocPitch((Float32**) &deviceArray2DOutput, &devicePitch,sizeof(Float32)*deviceRowNumber,deviceColNumber) == cudaErrorMemoryAllocation){
    return -1;
}

//Copy data from "hostArrayR" to "deviceArray2DInput" (#1)
cudaMemcpy2D(deviceArray2DInput,devicePitch,hostArrayR,sizeof(Float32)*colNumber,sizeof(Float32)*deviceColNumber,deviceRowNumber,cudaMemcpyHostToDevice);

//Clean the top 10000 elements in "hostArrayR" for verification. 
for(int i = 0; i < 10000; ++i){
    hostArrayR[i] = 0;
}

//Copy data back from "deviceArray2DInput" to "hostArrayR"(#2)
cudaMemcpy2D(hostArrayR,sizeof(Float32)*colNumber,deviceArray2DInput,devicePitch,sizeof(Float32)*deviceColNumber,deviceRowNumber,cudaMemcpyDeviceToHost);

2番目の割り当てブロックをコメントアウトしました。コードはうまく機能しました。データをホストアレイ「hostArrayR」からデバイスアレイ「deviceArray2DInput」にコピーしてコピーし直しました。ただし、両方の割り当てブロックが存在する場合、コピーバックされた「hostArrayR」は空でした(デバイスからデータがコピーバックされませんでした)。

データは行(#1)の「hostArrayR」にあったと確信していますが、行(#2)にはデータがありませんでした。最初の10000要素(配列のサイズよりはるかに小さい)をクリーンアップして、データが返されないことを確認しました。

VisualStudio2010でNvidiaNsight2.2を使用しています。配列サイズは1024x768で、フローティング32ビットデータを使用しています。私のGPUカードはGTX570です。メモリ割り当てエラーはなかったようです(または、コピーを実行する前にコードが返されます)。

メモリアライメントに「cudaMallocPitch()」を使用することを好むため、「cudaMalloc()」は試しませんでした。

4

1 に答える 1

3
  • 1 つの特定のエラーではなく、cudaSuccess に対して API 呼び出しを確認する必要があります。
  • memcpys によって返されるエラー値を確認する必要があります。
  • devicePitch2 番目の呼び出しで を上書きしています。cudaMallocPitch()配列の形状が異なるため、ピッチが異なる可能性があります。
于 2012-10-12T08:29:41.600 に答える