CUDA:创建网格的逻辑图

CUDA:创建网格的逻辑图,cuda,Cuda,我刚刚开始学习CUDA,我被一个基本的概念困住了:网格。我读到网格只是一个逻辑块集合(?),但我无法在脑海中创建场景的图片。我脑海中有一幅清晰的线程和块的图片,并且知道它们在物理GPU中的位置。块转到核心,线程转到流处理器。但网格在这幅图中的位置是什么 一些类比会被欣赏,并且会使理解更容易 附言-我在向udacity学习 #include "reference_calc.cpp" #include "utils.h" #include <stdio.h> __global_

我刚刚开始学习CUDA,我被一个基本的概念困住了:网格。我读到网格只是一个逻辑块集合(?),但我无法在脑海中创建场景的图片。我脑海中有一幅清晰的线程和块的图片,并且知道它们在物理GPU中的位置。块转到核心,线程转到流处理器。但网格在这幅图中的位置是什么

一些类比会被欣赏,并且会使理解更容易

附言-我在向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());
}
#包括“reference_calc.cpp”
#包括“utils.h”
#包括
__全局无效rgba到灰度(常量uchar4*常量rgbaImage,
无符号字符*常量灰度图像,
int numRows,int numCols)
{
int x,y,i;//i是一维数组greyImage的索引。x和y是rgbaImage的索引
i=(blockIdx.y*blockDim.x)+blockIdx.x;
x=(blockIdx.x*blockDim.x)+threadIdx.x;
y=(blockIdx.y*blockDim.y)+threadIdx.y;
if(x
实际上线程用于计算内核(至少如果我们指的是营销术语“cuda内核”),线程块与流式多处理器(SMs或开普勒语中的SMX)相关

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

有关此层次结构的图示,请参阅本手册的幻灯片9


您可以忽略该幻灯片上的声明“一次只能启动一个内核”。2009年创建该平台时是这样的,但在今天的新设备上不再如此。

[This]()应该有助于您理解。在《编程指南》的前几页中有一个很好的图表,每个CUDA工具包都提供了该图表。这很有帮助。现在我在udacity的第1单元代码中遇到了问题。我不知道它的网格大小计算是否不正确,或者内核本身是否存在问题。只有从顶部开始的一条细条是灰色的。由于未知的图像维度,我创建的线程超过了所需的线程数。代码在主帖子中。