2

float でデータ変数を宣言するために記述しなければならない C++ CUDA コードがあります。データ変数を double で宣言するコードも書き直す必要があります。

CUDA でこのような状況を処理するための優れた設計は何ですか?

同じコードを 2 セット持ちたくはありません。将来、変更を加えると、それ以外の点では同一のコードを 2 セット変更する必要があるからです。#ifdefまた、コード内で float と double の間で多くの変更を行うことなく、コードをきれいに保ちたいと考えています。

誰かが(メンテナンスと「読みやすい」という点で)良いデザインを提案できますか?

4

2 に答える 2

6

CUDAは型テンプレートをサポートしており、同じコードで複数の型を処理する必要がある場合にカーネルコードを実装する最も効率的な方法であることは間違いありません。

簡単な例として、単純なBLASAXPYタイプのカーネルを考えてみましょう。

template<typename Real>
__global__ void axpy(const Real *x, Real *y, const int n, const Real a)
{
    int tid = threadIdx.x + blockIdx.x * blockDim.x;
    int stride = blockDim.x * gridDim.x;

    for(; tid<n; tid += stride) {
        Real yval = y[tid];
        yval += a * x[tid];
        y[tid] = yval;
    }
}

このテンプレート化されたカーネルは、一般性を失うことなく、倍精度と単精度の両方でインスタンス化できます。

template axpy<float>(const float *, float *, const int, const float);
template axpy<double>(const double *, double *, const int, const double);

CUDAツールキットのすべての最新バージョンに同梱されているスラストテンプレートライブラリは、タイプに依存しないアルゴリズムを実装するためにこの機能を広範囲に使用します。

于 2013-01-20T18:28:07.030 に答える
2

テンプレート化に加えて、単一の typedef で目的を達成できる場合があります。

typedef float mysize;  // or double

次に、またはmysizeを使用する場所全体で使用します。 floatdouble

simpleTemplates サンプル コードに興味があるかもしれません。他にもテンプレート化された CUDA の例があり、 talonmiesが述べているように、広く使用されています。Thrust は、C++ プログラマーに他にも多くの利点を提供します。

于 2013-01-20T18:35:42.407 に答える