我在CUDA程序中遇到了一個非常奇怪的錯誤。經過一整天的調試,我已經將這個bug簡化成了這段代碼,它只是將數組[0]中的數據複製到所有其他數組[1〜9]中。數組[0]中的所有條目均爲零,因此在複製之後,數組[0〜9]中的所有內容都應爲零。但是,現實情況是一些內存被隨機值破壞。在我的情況下,數組[8]中的一些條目是非零的。我真的很感激,如果有人可以複製我的錯誤。非常感謝!有關cudaMemcpy的奇怪錯誤
下面的代碼:(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
謝謝, 崔
我看不出有任何內存分配正在爲'host_array'進行。 – njuffa
有一個「斷言(cudaMallocHost(&host_array,size)== cudaSuccess);」 – user2100910
我無法重現錯誤。所有的sumX值都是零。你在運行什麼GPU?什麼是主機操作系統?什麼CUDA版本? –