Reputation: 327
I got a very weird bug in my CUDA program. After a whole day of debugging, I have narrowed down the bug into this little piece of code, which simply copies data in arrays[0] to all other arrays[1~9]. All entries in arrays[0] are zero, so after the copying, everything in arrays[0~9] should be zero. However, the reality is that some memory is corrupted with random values. In my case, the some entries in arrays[8] are nonzero. I really appreciate it if someone can replicate my bug. Thank you so much!
Here's the code: (cudaDeviceSynchronize() added)
#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;
}
}
}
I compiled it using:
nvcc test.cu -lrt -lcudart -o test -g -O3
The output I got is:
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
Thanks, Cui
Upvotes: 1
Views: 223
Reputation: 327
My problem is solved by rolling back to an older CUDA driver version. It seems that we upgraded our CUDA toolkit to 7.0 a few days ago, and a new CUDA driver of version 346.46 was installed. I know it makes no sense, but this driver is causing the problem. The problem is solved when I reinstalled our previous driver.
Thank you for all your efforts of helping me. That is definitely the hardest bug I have ever seen!
Thanks,
Cui
Upvotes: 1