关于cudaMemcpy的奇怪错误

时间:2015-06-03 16:12:31

标签: cuda

我的CUDA程序中有一个非常奇怪的错误。经过一整天的调试,我已经将bug缩小为这段代码,它只是将数组[0]中的数据复制到所有其他数组[1~9]。数组[0]中的所有条目都为零,因此在复制后,数组[0~9]中的所有内容都应为零。但是,实际情况是某些内存被随机值损坏。在我的例子中,数组[8]中的一些条目是非零的。如果有人可以复制我的错误,我真的很感激。非常感谢你!

这是代码:(添加了cudaDeviceSynchronize())

#include <iostream>
#include <assert.h>

#include <cuda.h>
#include <cuda_runtime.h>

using namespace std;

int main() {
  size_t count = 20 * 1000 * 1000;
  size_t size = count * sizeof(float);
  void *arrays[10];
  for (size_t i = 0; i < 10; i++) {
    assert(cudaMalloc(&arrays[i], size) == cudaSuccess);
    cudaDeviceSynchronize();
    assert(cudaMemset(arrays[i], 0, size) == cudaSuccess);
    cudaDeviceSynchronize();
  }
  void *host_array;
  assert(cudaMallocHost(&host_array, size) == cudaSuccess);
  for (size_t i = 1; i < 10; i++) {
    void *dst_array = arrays[i];
    void *src_array = arrays[0];
    assert(cudaMemcpy(dst_array, src_array, size, cudaMemcpyDeviceToDevice) == cudaSuccess);
    cudaDeviceSynchronize();
    cout << "copied" << i << endl;
    for (size_t j = 0; j < 10; j++) {
      void *array = arrays[j];
      assert(cudaMemcpy(host_array, array, size, cudaMemcpyDeviceToHost) == cudaSuccess);
      cudaDeviceSynchronize();
      float *floats = reinterpret_cast<float *>(host_array);
      float sum = 0.0;
      for (size_t k = 0; k < count; k++) {
        sum += floats[k];
      }
      cout << "sum" << j << "=" << sum << endl;
    }
  }
}

我使用以下方法编译它:

nvcc test.cu -lrt -lcudart -o test -g -O3

我得到的输出是:

copied1
sum0=0
sum1=0
sum2=0
sum3=0
sum4=0
sum5=0
sum6=0
sum7=0
sum8=4.23087e+20
sum9=0
copied2
sum0=0
sum1=0
sum2=0
sum3=0
sum4=0
sum5=0
sum6=0
sum7=0
sum8=inf
sum9=0
copied3
sum0=0
sum1=0
sum2=0
sum3=0
sum4=0
sum5=0
sum6=0
sum7=0
sum8=inf
sum9=0
copied4
sum0=0
sum1=0
sum2=0
sum3=0
sum4=0
sum5=0
sum6=0
sum7=0
sum8=inf
sum9=0
copied5
sum0=0
sum1=0
sum2=0
sum3=0
sum4=0
sum5=0
sum6=0
sum7=0
sum8=inf
sum9=0
copied6
sum0=0
sum1=0
sum2=0
sum3=0
sum4=0
sum5=0
sum6=0
sum7=0
sum8=-1.08991e+38
sum9=0
copied7
sum0=0
sum1=0
sum2=0
sum3=0
sum4=0
sum5=0
sum6=0
sum7=0
sum8=-nan
sum9=0
copied8
sum0=0
sum1=0
sum2=0
sum3=0
sum4=0
sum5=0
sum6=0
sum7=0
sum8=0.0234719
sum9=0
copied9
sum0=0
sum1=0
sum2=0
sum3=0
sum4=0
sum5=0
sum6=0
sum7=0
sum8=2.51686e+17
sum9=0

谢谢, 崔

1 个答案:

答案 0 :(得分:1)

我的问题通过回滚到旧的CUDA驱动程序版本来解决。我们似乎在几天前将CUDA工具包升级到7.0,并安装了一个新版本为346.46的CUDA驱动程序。我知道这没有意义,但这个驱动程序导致了问题。当我重新安装以前的驱动程序时,问题就解决了。

感谢您为帮助我所做的一切努力。这绝对是我见过的最难的错误!

谢谢,