2014-12-17 3 views
-1

Это сводит меня с ума. Я не могу понять, почему это происходит. В принципе, у меня есть этот код, который отлично работает под Linux (версия Eclipse от Nsight). Я попытался сделать его совместимым с Windows, создав проект Visual Studio 2013 и настроив его.Ошибка cudaMemCpy2d (cudaErrorInvalidValue) при запуске конфигурации «отладки»

На данный момент все кажется прекрасным, код компилируется без проблем. Он даже отлично работает, когда я использую конфигурацию «Release». Однако, как только я попробую настроить Debug, приведенная ниже часть сбой с ошибкой cudaErrorInvalidValue.
Я отследил проблему до флага оптимизации. Отключение оптимизации приведет к сбою. Используя /O2 или /O1, код работает отлично!

Опять же, это прекрасно работает под Linux с оптимизацией или без нее. Интересно, что дает в оптимизации Windows. Если это поможет, я использую Visual Studio 2013 (обновление 4) с CUDA 6.5 и статической библиотекой. (В Linux это был CUDA 6.5, но динамическая компоновка библиотеки).

Весь код доступен here.

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); 
+1

SO [ожидает] (http://stackoverflow.com/help/on-topic) [MCVE] (http://stackoverflow.com/help/mcve) в самом вопросе. То, с чем вы связались («весь код»), даже не является полным кодом. Это заголовочный файл. –

+0

@RobertCrovella Но с этим проектом очень сложно создать минимально рабочий пример :(Ошибка возникает только на одном определенном виде данных ... Любые предложения? – M2X

+0

@RobertCrovella «Весь» код - это минимальная библиотека, которая вычисляет функции HoG на GPU. Репозиторий уже доступен. Также заголовочный файл действительно не является файлом заголовка. Это реализация класса шаблонов – M2X

ответ

3

Комментарий от @Park Young-Bae решить мою проблему (хотя потребовалось еще несколько усилий, чем с простой точки останова!)
Неопределенное поведение было вызвано моей невнимательности. В одном из классов я забыл переопределить копию и назначить. Поэтому, когда объект возвращался, его деструктор вызывался и освобождал всю память CUDA! В результате последующие API-интерфейсы CUDA на этот объект работали над оборванными ссылками.

Не могу поверить, насколько легко пропустить что-то крошечное в C++ и тратить часы на отладку

+0

Удивлен, как оптимизируется вызов destuctor в режиме выпуска G ++ и VC++! – M2X

 Смежные вопросы

  • Нет связанных вопросов^_^