我的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
谢谢, 崔
答案 0 :(得分:1)
我的问题通过回滚到旧的CUDA驱动程序版本来解决。我们似乎在几天前将CUDA工具包升级到7.0,并安装了一个新版本为346.46的CUDA驱动程序。我知道这没有意义,但这个驱动程序导致了问题。当我重新安装以前的驱动程序时,问题就解决了。
感谢您为帮助我所做的一切努力。这绝对是我见过的最难的错误!
谢谢,
崔