【问题标题】:Unable to find source of exception: cudaError_enum at memory location无法找到异常源:内存位置的 cudaError_enum
【发布时间】:2012-06-12 17:49:52
【问题描述】:

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

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

我的构建环境是:

  • IDE:Microsoft Visual C++ 2010 Express
  • NVIDIA 驱动程序:301.27
  • CUDA:NVIDIA CUDA Toolkit 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++ 异常。只有当我使用 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;
}

【问题讨论】:

  • 调试器捕获组件在正常操作过程中可能抛出的异常。因此,可能有一个组件可以预期这些异常并在它们到达您的代码之前捕获它们。这个异常真的会导致您的代码出现问题吗?

标签: c++ cuda


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-08-10
    • 2012-12-22
    • 1970-01-01
    • 2020-08-19
    • 2023-03-29
    • 1970-01-01
    • 2017-05-10
    • 2011-10-20
    • 2016-01-23
    相关资源
    最近更新 更多