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