2015-06-03 92 views
1

我在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 

謝謝, 崔

+0

我看不出有任何內存分配正在爲'host_array'進行。 – njuffa

+0

有一個「斷言(cudaMallocHost(&host_array,size)== cudaSuccess);」 – user2100910

+1

我無法重現錯誤。所有的sumX值都是零。你在運行什麼GPU?什麼是主機操作系統?什麼CUDA版本? –

回答

1

我的問題通過回滾到舊的CUDA驅動程序版本來解決。看起來我們幾天前將CUDA工具包升級到7.0,並且安裝了一個新的346.46版CUDA驅動程序。我知道這沒有意義,但是這個驅動程序導致了這個問題。當我重新安裝我們以前的驅動程序時,問題就解決了。

感謝您爲幫助我所做的一切努力。這絕對是我見過的最難的錯誤!

感謝,

+2

不知道你是否在暗示這一點,但我懷疑你的分析到目前爲止表明在346.46中的一個錯誤。我使用346.46進行了測試,但無法用您提供的代碼重現您的問題。所以/當然有一些關於你的機器配置(不同於我的),這是造成這個問題的原因,或許在你使用驅動程序安裝/卸載/重新安裝後發生了某種變化。不過,我認爲這裏沒有足夠的數據來表明司機正在造成這種情況。 –