CUDA プログラムでグリッドを操作したいのですがdim3
、初期化の時点でパラメーターがわかりません (最初に計算する必要があります)。これを回避する簡単な方法はありますか?
もちろん、カーネル呼び出しの括弧内にパラメーターを渡すこともできます。たとえば、パラメーターが m と n の場合です。kernel<<<m*n, thread_size>>>(...)
ただし、インデックスを再計算する必要があります。
CUDA プログラムでグリッドを操作したいのですがdim3
、初期化の時点でパラメーターがわかりません (最初に計算する必要があります)。これを回避する簡単な方法はありますか?
もちろん、カーネル呼び出しの括弧内にパラメーターを渡すこともできます。たとえば、パラメーターが m と n の場合です。kernel<<<m*n, thread_size>>>(...)
ただし、インデックスを再計算する必要があります。
dim3
vector_types.h
ファイルで次のように定義されている整数構造体型です。
struct __device_builtin__ dim3
{
unsigned int x, y, z;
#if defined(__cplusplus)
__host__ __device__ dim3(unsigned int vx = 1, unsigned int vy = 1, unsigned int vz = 1) : x(vx), y(vy), z(vz) {}
__host__ __device__ dim3(uint3 v) : x(v.x), y(v.y), z(v.z) {}
__host__ __device__ operator uint3(void) { uint3 t; t.x = x; t.y = y; t.z = z; return t; }
#endif /* __cplusplus */
};
dim3
変数を次のように定義できます。
dim3 grid(256); // defines a grid of 256 x 1 x 1 blocks
dim3 block(512,512); // defines a block of 512 x 512 x 1 threads
そしてそれを次のように使用します
foo<<<grid,block>>>(...);
あなたの興味の場合には、あなたは持っているでしょう
dim3 grid(m*n);
dim3 block(thread_size);
kernel<<<grid,block>>>(...)
の定義から、とdim3
のフィールドを明示的に初期化する必要はありません。初期化中に提供されなかったフィールドはすべて 1 に初期化されます。grid
block
次のような割り当てでgrid
とのフィールドを変更できますblock
grid.x = 512;
block.y = 64;