两个连续的“cudaMallocPitch”使代码失败

时间:2012-10-12 05:52:28

标签: visual-studio-2010 cuda nsight

我写了一个简单的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);

我注释掉了第二个分配块,代码运行良好。它将数据从主机数组“hostArrayR”复制到设备数组“deviceArray2DInput”并将其复制回来。 但是,如果两个分配块都存在,则复制的“hostArrayR”为空(没有数据从设备复制回来)。

我确信数据位于第(#1)行的“hostArrayR”中,但行(#2)没有数据。我清理了前10000个元素(远远小于数组的大小),以确认数据没有恢复。

我在Visual Studio 2010上使用Nvidia Nsight 2.2。数组大小为1024x768,我使用的是浮动32位数据。我的GPU卡是GTX570。似乎没有内存分配错误(或者在复制内容之前代码会返回)。

我没有尝试“cudaMalloc()”因为我更喜欢使用“cudaMallocPitch()”进行内存对齐。

1 个答案:

答案 0 :(得分:3)

  • 你应该检查针对cudaSuccess的API调用,而不是一个 具体错误。
  • 您应该检查memcpys返回的错误值。
  • 您在第二次devicePitch调用时覆盖cudaMallocPitch(),数组的形状不同,因此可能会有不同的音高。