2

開発およびデバッグをデバッグするとき、コードを倍精度で実行したいと考えています。ただし、機能していることがわかったら、単精度 (つまりfloats) のみを使用してコードを実行するオプションが必要です。したがって、コードを大幅に書き直すことなく、これらの精度を簡単に切り替えられるようにしたいと考えています。私はいくつかの#define旗を考えていました

#define PRECISION double
...

thrust::device_vector<PRECISION> myVec;

しかし、コンパイラはそれを好まないようです。これを実装する方法についてのアイデアはありますか?

この質問は、コンパイラフラグの問題を解決するという点で非常に似ていることを知っています。しかし、ソースコード内から直接フラグを設定できることを望んでいました。

4

1 に答える 1

8

次のように実行できます。

#ifdef MY_USE_DOUBLE_PRECISION
typedef double Real;
#else
typedef float Real;
#endif

....

thrust::device_vector<Real> myVec;

MY_USE_DOUBLE_PRECISION浮動小数点型の定義を制御するために使用しRealます。独自のカーネルがある場合は、どちらかまたはieRealの代わりに使用することもできます。:floatdouble

__global__ void kernel (Real *input, Real *output)
{
   ...
}

カーネル コードの単精度バージョンと倍精度バージョンの両方をコンパイルし、それらが定義されているコンパイル ユニットの外部 (ライブラリなど) でどちらを使用するかを選択する場合は、カーネルをテンプレート化できます。

 template<typename T>
__global__ void kernel (T *input, T *output)
{
   ...
}

template __global__ void kernel<float>(float *, float *);
template __global__ void kernel<double>(double *, double *);

そして、別のソースファイルで

#ifdef MY_USE_DOUBLE_PRECISION
typedef double Real;
#else
typedef float Real;
#endif

....

kernel<Real><<<griddim, blockdim>>>(....);
于 2013-05-05T10:47:24.047 に答える