无法找到异常来源:内存位置的cudaError_enum

时间:2012-06-08 16:33:48

标签: c++ cuda

我正在尝试识别Microsoft C ++异常的来源:

  

test_fft.exe中0x770ab9bc的第一次机会异常:Microsoft C ++异常:内存位置为0x016cf234的cudaError_enum ...

我的构建环境是:

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

1 个答案:

答案 0 :(得分:2)

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

这被认为是CUDA下的正常行为。我相信在CUDA 5.5中有一些尝试消除它。您可能希望尝试这一点,尽管这不是一个问题。