cudaMemcpy влияет на другие переменные
Вот мой код для программы, которая делает гистограмму на изображении, а затем сканирует префиксную сумму на гистограмме http://codepad.org/4RMtWn1e. Проблема в строке 396, которая правильно выводит значение numBins (количество бинов для гистограммы) в 1024. Затем я копирую гистограмму из памяти устройства обратно в память хоста. Это каким-то образом меняет значение numBins, и следующий вывод равен 0. Это кажется очень странным. Я не делал никаких конкретных изменений в numBins, но это все равно меняет значение. Мне кажется, что если я смогу это понять, я пойму, почему моя программа не работает.
1 ответ
Это не верно:
unsigned int* h_histogram;
h_histogram = (unsigned int*) malloc(sizeof(unsigned int)* 1024);
std::cout << numBins;
checkCudaErrors(cudaMemcpy(&h_histogram, d_histogram, sizeof(unsigned int)* numBins, cudaMemcpyDeviceToHost));
^
|
h_histogram is already a pointer
Вместо этого сделайте это:
checkCudaErrors(cudaMemcpy(h_histogram, d_histogram, sizeof(unsigned int)* numBins, cudaMemcpyDeviceToHost));
(единственное изменение заключается в том, чтобы удалить амперсанд перед h_histogram
Я не уверен, почему numBins
был поврежден точно, но этот конкретный странный cudaMemcpy
операция не будет копировать в место назначения, которое вы ожидаете, вместо этого она будет перезаписывать значение указателя, хранящееся в h_histogram
а также все, что было после этого. И если numBins
После того, как он был сохранен, он также будет перезаписан.