1

私は構造体の配列を扱っており、各 cuda ブロックは 1 つの構造体 (そして 1 つのみ) のデータを使用し、その周りで多くの計算を行います。プログラムが機能するために、共有メモリに構造体をロードしたいと思います。

そのような memcpy 関数を使用しようとしました:

struct LABEL_2D{
    int a;
    float * b[MAX];
};




__shared__ struct LABEL_2D self_label;

if(threadIdx.x == 0){
memcpy(&self_label,
           label+(blockIdx.x*sizeof(struct LABEL_2D)),
           sizeof(struct LABEL_2D));
}
 __syncthreads();

しかし、実行時に次のエラーが発生しました: unspecified launch failure cudaGetLastError()

共有メモリに構造体をロードできるかどうか疑問に思っています。

4

1 に答える 1

1

memcpy() でデータをコピーすることは想定されていません。

共有メモリ変数を単純に初期化するために、最初のスレッドを割り当てることができます。

struct LABEL_2D{
    int a;
    float * b[MAX];
};


__shared__ LABEL_2D self_label;

if(threadIdx.x == 0){
    slef_label = label[blockIdx.x];

}
 __syncthreads();

編集:他の回避策は実質的に役に立たなかったため削除しました。

于 2013-03-18T16:35:54.570 に答える