データ型のサイズが変わったときにカーネルで実行される命令の数を調べてみました
カスタムサイズのデータ構造を取得するために、次のように構造体を作成しました。
#define DATABYTES 40
__host__ __device__
struct floatArray
{
float a[DATABYTES/4];
};
そして、上記のデータ型配列をある配列から別の配列にコピーするためだけにカーネルを作成しました
__global__
void copy_large_data(floatArray * d_in, floatArray * d_out)
{
d_out[threadIdx.x] = d_in[threadIdx.x];
}
次に、単一のブロックで 32 スレッドのみに対して上記のカーネルを呼び出しました
floatArray * d_in;
floatArray * d_out;
cudaMalloc(&d_in, 32 * sizeof(floatArray));
cudaMalloc(&d_out, 32 * sizeof(floatArray));
copy_large_data<<<1, 32>>>(d_in, d_out);
を使用してプログラムをプロファイリングし、nvprof
をチェックするinstructions per warp
と、 の値の変化に伴ってパラメータ値が変化することがわかりましたDATABYTES
。
私の質問は、この命令数の増加の理由がfloatArray
構造体内の配列によるものかどうかです。a
カーネルでコピーを呼び出すと、構造体内の配列の各要素が実際に展開およびコピーされfloatArray
、より多くの命令が作成されるためです。
単一の命令を使用してカーネル内のカスタム構造体変数をコピーする方法はありますか?