3

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++ クラスの背後にラップしようとしています。このようにして、1 つのデータ型から 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;
}
4

1 に答える 1

2

あなたが行っている観察は、CUDA ライブラリ内で適切にキャッチされ、処理される例外に関係しています。場合によっては、CUDA GPU 操作の通常の部分です。この場合、アプリケーションは API エラーを返さないと思います。これを報告できる VS 環境にいなかった場合、これはまったく観察されないでしょう。

これは、CUDA では正常な動作と見なされます。CUDA 5.5でそれを排除する試みがいくつかあったと思います。どちらにしても問題とは見なされませんが、それを試してみることをお勧めします。

于 2013-08-08T12:47:57.077 に答える