0

2D 配列 a[][] を作成する方法はありますか? a[i] 自体のそれぞれが CUDA の他のデータ型に強制的に配置されますか?

私はこのようなことをしたい:

__shared__ unsigned char a[20][8];// where a[i] is aligned to 8-byte boundary;

double t=*((double *)(a[2]));

または次のようなものでも:

__shared__ unsigned char a[20][9];// where a[i] is aligned to 8-byte boundary;

double t=*((double *)(a[2]));
4

2 に答える 2

1

ユニオンを使ってみてはどうですか?

union my_union_type {
    char   a[8];
    double t;
};

my_union_type var[20];

char   a = var.a[2][3];
double t = var.t[2];

(talonmies が指摘したように) あなたの例は違法であり、無効なコードを生成するため、これは 2 番目の例と同等ではありませんが、私のコードは各要素の後に 7 バイトの正しい配置を挿入します。しかし、それはあなたが求めているものに最も近いと思います。

于 2013-03-27T15:43:41.947 に答える
1

あなたが示した両方のコード スニペットは、CUDA では違法です。

現在のすべてのハードウェアでは、型をワード サイズの境界に揃える必要があります。あなたの例ではa[0]a[8]、 、 などからの読み取りのみが有効です。これは、ハードウェアが8 バイト境界で整列された境界から読み取りをa[16]行う必要があるためです。doubleそれ以外の場合、デバイスから実行時エラーが発生します。構造体を使用しようとしても、コンパイラはパディングによってアラインメントを強制します。別の有効なアラインメントが必要な場合、言語は構造体の__align__ 指定子をサポートしています。

これは、ノーと言う長い曲がりくねった方法です。

于 2013-03-27T08:43:08.303 に答える