最終更新: mikk_ni3_92 2008年10月03日(金) 13:05:46履歴
現在地 >> メニュー >> CUDA >> CUDA::基本編03
INDEX:CUDA::基本編02 << CUDA::基本編03 >> CUDA::基本編04
cudaMemcpy()関数を使う事でできる。
[例]
threadIdx型。「threadIdx.x」「threadIdx.y」などでスレッドのIDが取得できる
例えば、
とすると、
blockIdx型。threadIdx型と同様。例えば、
とすると
blockDim型。1ブロックの大きさがわかる。例えば、
とすると、
blockDim.x → 50
blockDim.y → 1
となる。
gridDim型。グリッドの大きさがわかる。例えば、
とすれば、
gridDim.x → 2
gridDim.y → 1
となる。
dim3 threads(a,1,1);
dim3 grid(b,1,1);
などのようにa、bの部分のみ変わる場合
[例]:ブロック数(4×1)、グリッド数(25×1)個の場合
dim3 threads(a,1,1);
dim3 grid(b,c,1);
などのようにa、b、cの部分のみ変わる場合
[例]:ブロック数(2×2)、グリッド数(25×1)個の場合
dim3 threads(a,b,1);
dim3 grid(c,d,1);
などのようにa、b、c、dのが変わる場合
[例]:ブロック数(2×2)、グリッド数(5×5)個の場合
※メモ
1次元配列風にアクセスしてもよいが、すなおに2つに分けた方がわかりやすい(と思う)。
サンプルコード >> CUDA::基本編03::まとめコード
INDEX:CUDA::基本編02 << CUDA::基本編03 >> CUDA::基本編04
cudaMemcpy()関数を使う事でできる。
[例]
float* x; //CPU用 ... ... float* gpu_x;//GPU用 ... ... CUDA_SAFE_CALL( cudaMemcpy( gpu_x, x, DataSize , cudaMemcpyHostToDevice)); //Host -> GPUのデータコピー ... //--- 何らかの計算 ---// ... CUDA_SAFE_CALL( cudaMemcpy( x, gpu_x,DataSize, cudaMemcpyDeviceToHost) );//GPU -> Hostへの転送 ... ...
threadIdx型。「threadIdx.x」「threadIdx.y」などでスレッドのIDが取得できる
例えば、
dim3 threads(50,1,1); ... ... GpuFunction<<<... ,threads, ...>>>(...);
とすると、
- threadIdx.x → 0〜49
- threadIdx.y → 0
blockIdx型。threadIdx型と同様。例えば、
dim3 grid(2,1,1); ... ... GpuFunction<<<grid,... ...>>>(... ...);
とすると
- blockIdx.x = 0 か 1
- blockIdx.y = 0
blockDim型。1ブロックの大きさがわかる。例えば、
dim3 threads(50,1,1); ... ... GpuFunction<<<... ,threads, ...>>>(...);
とすると、
blockDim.x → 50
blockDim.y → 1
となる。
gridDim型。グリッドの大きさがわかる。例えば、
dim3 grid(2,1,1); ... ... GpuFunction<<<grid,... ...>>>(... ...);
とすれば、
gridDim.x → 2
gridDim.y → 1
となる。
dim3 threads(a,1,1);
dim3 grid(b,1,1);
などのようにa、bの部分のみ変わる場合
スレッドId = blockIdx.x * blockDim.x + threadIdx.x
[例]:ブロック数(4×1)、グリッド数(25×1)個の場合
//----------- GPU上の計算 --------------------//
__global__ void GpuFunction(float *input)
{
const int TidX = blockIdx.x * blockDim.x + threadIdx.x; //スレッドIdを取得
input[TidX] += 100; //要素に100を加算
__syncthreads(); //同期をとる
}
... ...
float* gpu_x;
dim3 threads(25,1,1); //Db
dim3 grid(4,1,1); //Dg
... ...
GpuFunction<<<grid,threads>>>(gpu_x);
... ...
dim3 threads(a,1,1);
dim3 grid(b,c,1);
などのようにa、b、cの部分のみ変わる場合
スレッドId = (blockIdx.y * gridDim.x + blockIdx.x) * blockDim.x + threadIdx.x
[例]:ブロック数(2×2)、グリッド数(25×1)個の場合
//----------- GPU上の計算 --------------------//
__global__ void GpuFunction(float *input)
{
const int TidX = (blockIdx.y * gridDim.x + blockIdx.x) * blockDim.x + threadIdx.x; //スレッドIdを取得
input[TidX] += 100; //要素に100を加算
__syncthreads(); //同期をとる
}
... ...
float* gpu_x;
dim3 threads(25,1,1); //Db
dim3 grid(2,2,1); //Dg
... ...
GpuFunction<<<grid,threads>>>(gpu_x);
... ...
dim3 threads(a,b,1);
dim3 grid(c,d,1);
などのようにa、b、c、dのが変わる場合
スレッドId = threadIdx.x+blockDim.x*threadIdx.y + (blockIdx.x*blockDim.x*blockDim.y) + (blockIdx.y*blockDim.x*blockDim.y*gridDim.x)
[例]:ブロック数(2×2)、グリッド数(5×5)個の場合
//----------- GPU上の計算 --------------------//
__global__ void GpuFunction(float *input)
{
const int TidX
= threadIdx.x+blockDim.x*threadIdx.y
+(blockIdx.x*blockDim.x*blockDim.y)
+(blockIdx.y*blockDim.x*blockDim.y*gridDim.x);
input[TidX] += 100; //要素に100を加算
__syncthreads(); //同期をとる
}
... ...
float* gpu_x;
dim3 threads(5,5,1); //Db
dim3 grid(2,2,1); //Dg
... ...
GpuFunction<<<grid,threads>>>(gpu_x);
... ...
※メモ
1次元配列風にアクセスしてもよいが、すなおに2つに分けた方がわかりやすい(と思う)。
... ... unsigned int x = blockIdx.x*blockDim.x + threadIdx.x; unsigned int y = blockIdx.y*blockDim.y + threadIdx.y; ... ...
サンプルコード >> CUDA::基本編03::まとめコード