2015-06-03 2 views
1

У меня очень странная ошибка в моей программе CUDA. После целого дня отладки я сузил ошибку в этом маленьком фрагменте кода, который просто копирует данные в массивы [0] ко всем другим массивам [1 ~ 9]. Все записи в массивах [0] равны нулю, поэтому после копирования все в массивах [0 ~ 9] должно быть равно нулю. Однако реальность такова, что некоторая память повреждена случайными значениями. В моем случае некоторые записи в массивах [8] отличны от нуля. Я очень ценю это, если кто-то может воспроизвести мою ошибку. Спасибо огромное!Weird bug about 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

Существует «assert (cudaMallocHost (& host_array, size) == cudaSuccess); – user2100910

+1

Я не могу воспроизвести ошибку. Все значения sumX равны нулю. Какой GPU вы используете? Что такое ОС хоста? Какая версия CUDA? –

ответ

1

Моя проблема решена путем возврата к более старой версии драйвера CUDA. Кажется, что мы обновили наш инструментарий CUDA до 7.0 несколько дней назад, и был установлен новый драйвер CUDA версии 346.46. Я знаю, что это не имеет смысла, но этот драйвер вызывает проблему. Проблема решена, когда я переустановил наш предыдущий драйвер.

Благодарим вас за все ваши усилия по оказанию мне помощи. Это определенно самая сложная ошибка, которую я когда-либо видел!

Спасибо,

Цуй

+2

Не уверен, что вы предлагаете это, но я сомневаюсь, что ваш анализ пока указывает на ошибку в 346.46. Я использовал 346.46 для тестирования, которое я сделал, и не смог воспроизвести вашу проблему с кодом, который вы предоставили. Таким образом, есть/было что-то вроде конфигурации вашего компьютера (отличной от моей), которая вызывала проблему, которая, возможно, каким-то образом изменилась после того, что вы сделали с установкой драйвера/удалением/переустановкой. Однако я не думаю, что здесь есть почти достаточно данных, чтобы предположить, что драйвер вызывает это. –