我正在尝试确定Microsoft C++异常的来源:



我的构建环境是:

  • IDE:Microsoft Visual C++ 2010 Express
  • NVIDIA驱动程序:301.27
  • CUDA:NVIDIA CUDA工具包v4.2(32位)
  • SDK:NVIDIA GPU计算SDK 4.2(32位)

  • 问题范围:我正在尝试将CUFFT包装在C++类后面。这样,我可以隐藏从一种数据类型到cufftComplex的转换,FFT的执行以及调用代码的内存传输。

    类头:
    #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 ) );
        }
    

    在调用cudaMalloc的第一行的FFT构造函数中引发了Microsoft C++异常。仅当我在Visual Studio调试器中使用FFT类运行代码时,才会出现此错误。

    引用

    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;
    }
    

    最佳答案

    您所做的观察与在CUDA库中正确捕获和处理的异常有关。在某些情况下,它是CUDA GPU操作的正常部分。我相信您的应用在这种情况下不会返回API错误。如果您不在可以报告此问题的VS环境中,则根本不会观察到此情况。

    在CUDA下,这被认为是正常行为。我相信在CUDA 5.5中有一些消除它的尝试。您可能想尝试一下,尽管无论哪种方式都不认为这是一个问题。

    09-08 04:11
    查看更多