Не удалось найти источник исключения: cudaError_enum в ячейке памяти

Я пытаюсь определить источник исключения Microsoft С++:

Исключение первого шанса в 0x770ab9bc в test_fft.exe: исключение Microsoft С++: cudaError_enum в ячейке памяти 0x016cf234...

Моя среда сборки:

  • IDE: Microsoft Visual С++ 2010 Express
  • Драйвер NVIDIA: 301.27
  • CUDA: NVIDIA CUDA Toolkit v4.2 (32-разрядная версия)
  • SDK: NVIDIA GPU Computing SDK 4.2 (32-разрядная версия)

Проблемная область. Я пытаюсь обернуть CUFFT за класс С++. Таким образом, я могу скрыть перевод от одного типа данных к cufftComplex, выполнение БПФ и передачу памяти из вызывающего кода.

Заголовок класса:

#ifndef SIGNAL_PROCESSING_FFT_HPP
#define SIGNAL_PROCESSING_FFT_HPP

#include "signal_processing\types.hpp"

#include <boost/cstdint.hpp>

#include <cufft.h>

#include <vector>

namespace signal_processing {

    class FFT {
    public:

        FFT ( boost::uint32_t size );

        virtual ~FFT();

        void forward ( ComplexVectorT const& input, ComplexVectorT& output );

        void reverse ( ComplexVectorT const& input, ComplexVectorT& output );

    private:

        cufftComplex* m_device_data;

        cufftComplex* m_host_data;

        cufftHandle m_plan;

        boost::uint32_t m_size;
    };

}

#endif // SIGNAL_PROCESSING_FFT_HPP

Конструктор FFT:

FFT::FFT ( boost::uint32_t size )
        : m_size ( size )
    {
            CudaSafeCall ( cudaMalloc((void**)&m_device_data, sizeof(cufftComplex) * m_size ) );
            m_host_data = (cufftComplex*) malloc ( m_size * sizeof(cufftComplex) );
            CufftSafeCall ( cufftPlan1d ( &m_plan, m_size, CUFFT_C2C, 1 ) );
    }

Исключение Microsoft С++ генерируется в конструкторе FFT в первой строке, где вызывается вызов cudaMalloc. Эта ошибка возникает только в том случае, если я запускаю код, используя класс FFT с отладчиком Visual Studio.


Ссылки

Определение CudaSafeCall

#define CudaSafeCall(err) __cudaSafeCall ( err, __FILE__, __LINE__ )

__ Определение cudaSafeCall

inline void __cudaSafeCall ( cudaError err, const char* file, const int line )
{
#ifdef CUDA_ERROR_CHECK
        if ( cudaSuccess != err )
        {
            std::cerr << boost::format ( "cudaSafeCall() failed at %1$s:%2$i : %3$s\n" )
                % file
                % line
                % cudaGetErrorString ( err );
            exit(-1);
        }
#endif
        return;
}

Ответ 1

Наблюдение, которое вы делаете, связано с исключением, которое поймано и правильно обработано в библиотеках CUDA. В некоторых случаях это обычная часть работы графического процессора CUDA. Я считаю, что ваше приложение не возвращает ошибок API в этом случае. Если вы не были в среде VS, которая могла бы сообщить об этом, вы не заметили бы этого вообще.

Это считается нормальным поведением в CUDA. Я считаю, что были попытки устранить его в CUDA 5.5. Возможно, вы захотите попробовать это, хотя это не считается проблемой в любом случае.