Это сводит меня с ума. Я не могу понять на всю жизнь, почему это происходит. По сути, у меня есть этот код, который прекрасно работал под Linux (Nsight eclipse edition). Я попытался сделать его совместимым с Windows, создав проект Visual Studio 2013 и настроив его.
На данный момент все вроде бы нормально, код компилируется без проблем. Он даже работает нормально, когда я использую конфигурацию «Release». Тем не менее, как только я пытаюсь отладить конфигурацию, часть ниже вылетает с cudaErrorInvalidValue
ошибка.
Я отследил проблему до флага оптимизации. Отключение оптимизации приведет к сбою. С помощью /O2
или же /O1
код работает нормально!
Опять же, это прекрасно работает под Linux с оптимизацией или без нее. Интересно, что дает в Windows оптимизация. Если это поможет, я использую Visual Studio 2013 (обновление 4) с CUDA 6.5 и связыванием статической библиотеки. (В Linux это была CUDA 6.5, но динамическое связывание библиотек).
Весь код доступен Вот.
size_t hostPitch = (size_t)getHostPitch();
size_t devicePitch = (size_t)getDevicePitch();
size_t cal = (size_t)(width * numChannels * sizeof(T));
size_t h = (size_t)height;
cudaError_t eCUDAResult = cudaMemcpy2D((void*)this->hostData, hostPitch, (const void*)this->deviceData, devicePitch, cal, h, cudaMemcpyDeviceToHost);
Комментарий @Park Young-Bae решил мою проблему (хотя потребовалось несколько больше усилий, чем простая точка останова!)
Неопределенное поведение было вызвано моей небрежностью. В одном из классов я забыл переопределить копирование и присвоение. Следовательно, когда объект возвращался, вызывался его деструктор, который освобождает всю память CUDA! В результате последующие вызовы API CUDA для этого объекта работали над висячими ссылками.
Не могу поверить, как легко пропустить что-то крошечное в C ++ и потратить часы на отладку