CUDA:创建网格的逻辑图片

时间:2013-07-17 04:40:04

标签: cuda

我刚开始学习CUDA而且我坚持一个基本概念:网格。我已经读过网格只是块的逻辑集合(?),但我无法在脑海中创建场景图片。我清楚地了解了脑海中的线程和块,并了解它们在物理GPU中的相关性。阻止转到核心,线程转到流处理器。但网格在哪里适合这张图片?

一些类比将会受到赞赏,并使理解更容易。

P.s.-我正在学习udacity。

    #include "reference_calc.cpp"
#include "utils.h"
#include <stdio.h>

__global__ void rgba_to_greyscale(const uchar4* const rgbaImage,
                       unsigned char* const greyImage,
                       int numRows, int numCols)
{
    int x,y,i; // i is index for 1D array greyImage. x and y for rgbaImage
    i = (blockIdx.y * blockDim.x) + blockIdx.x;
    x= (blockIdx.x * blockDim.x) + threadIdx.x;
    y= (blockIdx.y * blockDim.y) + threadIdx.y;

    if(x < numCols && y < numRows)
    {
        greyImage[i] = (0.299f * rgbaImage[y].x) + (0.587f * rgbaImage[y].y) + (0.114f * rgbaImage[y].z);
    }

}

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)
{
  //You must fill in the correct sizes for the blockSize and gridSize
  //currently only one block with one thread is being launched
  const dim3 blockSize(10, 10, 1);  //TODO
  size_t gridSizeX, gridSizeY;
  gridSizeX = numCols + (10 - (numCols % 10) );  //adding some number to make it multiple of 10
  gridSizeY = numRows + (10 - (numRows % 10) );  //adding some number to make it multiple of 10

  const dim3 gridSize( gridSizeX, gridSizeY, 1);  //TODO
  rgba_to_greyscale<<<gridSize, blockSize>>>(d_rgbaImage, d_greyImage, numRows, numCols);

  cudaDeviceSynchronize(); checkCudaErrors(cudaGetLastError());
}

1 个答案:

答案 0 :(得分:2)

实际上线程会转到计算核心(至少如果我们指的是营销术语“cuda核心”),并且线程块与流式多处理器相关联(SM或Kepler发言的SMX)。

GRID 内核启动创建的所有线程。如果您愿意,可以将其称为块集合,因为网格首先按层次划分为块(然后是warp),然后是线程。

有关此层次结构的图形表示,请参阅此webinar deck的幻灯片9。

您可以忽略该幻灯片上的语句“一次只能启动一个内核”。在2009年创建该套牌时确实如此,但今天在新设备上已不再适用。