私のコードでは、関数への引数の受け渡しを容易にするために構造体を使用しています (構造体の配列は使用しませんが、一般的には配列の構造体を使用します)。私がcuda-gdbにいて、次のような単純な構造に値を与えるカーネルのポイントを調べるとき
struct pt{
int i;
int j;
int k;
}
複雑なことをしているわけではなく、メンバーに値を指定する必要があることは明らかですが、...
スタックの位置 0 を要求されましたが、スタックには 0 要素しかありません。
なので、配列ではないにしても、その時点でメモリのアラインメントに問題があるのではないかと考えています。そこで、ヘッダーファイルの定義を次のように変更します
struct __align__(16) pt{
int i;
int j;
int k;
}
しかし、コンパイラが同じ定義を使用するホスト コード ファイルをコンパイルしようとすると、次のエラーが発生します。
エラー: 数値定数エラーの前に unqualified-id が必要です: 数値定数エラーの前に ')' が必要です: ';' の前にコンストラクタ、デストラクタ、または型変換が必要です トークン
では、ホスト構造とデバイス構造に対して 2 つの異なる定義を使用する必要があるのでしょうか ???
さらに、アラインメントの論理を一般化する方法をお聞きしたいと思います。私はコンピューター科学者ではないので、プログラミング ガイドの 2 つの例は全体像を把握するのに役立ちません。
たとえば、次の 2 つをどのように配置すればよいでしょうか。または、6 つの float を持つ構造をどのように配置する必要がありますか? または4つの整数?繰り返しますが、私はそれらの配列を使用していませんが、カーネルまたは _ device _ 関数内でこれらの構造を使用して多くの変数を定義しています。
struct {
int a;
int b;
int c;
int d;
float* el;
} ;
struct {
int a;
int b
int c
int d
float* i;
float* j;
float* k;
} ;
アドバイスやヒントを事前にありがとう