RGBA画像をグレースケールに変換するcudaチュートリアルに取り組んでいます。blockSize
しかし、 と を変更するとgridSize
X33 の時間が改善される理由がわかりませんでした。
__global__
void rgba_to_greyscale(const uchar4* const rgbaImage,
unsigned char* const greyImage,
int numRows, int numCols)
{
int i = blockIdx.x*numCols + threadIdx.x;
float channelSum = .299f * rgbaImage[i].x + .587f * rgbaImage[i].y + .114f * rgbaImage[i].z;
greyImage[i]= channelSum;
}
void your_rgba_to_greyscale(const uchar4 * const h_rgbaImage, uchar4 * const d_rgbaImage,
unsigned char* const d_greyImage, size_t numRows, size_t numCols)
{
const dim3 blockSize(numCols, 1, 1);
const dim3 gridSize(numRows, 1 , 1);
rgba_to_greyscale<<<gridSize, blockSize>>>(d_rgbaImage, d_greyImage, numRows, numCols);
cudaDeviceSynchronize(); checkCudaErrors(cudaGetLastError());
}
上記のように設定すると:
const dim3 blockSize(numCols, 1, 1);
const dim3 gridSize(numRows, 1 , 1);
私は得るYour code executed in 0.030304 ms
私が設定したとき:
const dim3 blockSize(1, 1, 1);
const dim3 gridSize(numRows, numCols , 1);
新しいインデックスで動作するようにスレッド関数を更新します。
int i = blockIdx.x*numCols + blockIdx.y;
私は得るYour code executed in 0.995456 ms
。
- GPUは2番目のグリッド分割ですべてのピクセルを個別に計算できるため、逆になると思いますキャッシュの一貫性の問題に関連していますか? なぜこれらの結果が得られるのですか?
- 理論上、この問題のグリッドとブロックのサイズはどれくらいが最適ですか? 実行時に計算することは可能ですか?
ご参考までに:
numRows = 313 numCols =557
技術的特性:
#uname -a && /usr/bin/nvidia-settings -v
Linux ip-10-16-23-92 3.2.0-39-virtual #62-Ubuntu SMP Thu Feb 28 00:48:27 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
nvidia-settings: version 304.54 (buildmeister@swio-display-x86-rhel47-11)