cuda2
多维内核
多维内核配置
示例
image-20210607161352581(C:\Users\Aerialith\AppData\Roaming\Typora\typora-user-images\image-20210607161352581.png
处理 2D 网格的图片
C/C++ 中的行优先布局
PictureKernel 的源代码
1 | __global__ void PictureKernel(float* d_Pin, float* d_Pout, int height, int width){ |
用于启动 PictureKernel 的主机代码
1 | // assume that the picture is m × n, |
用 16x16 的块覆盖 62x76 的图片
![image-20210607161715736(C:\Users\Aerialith\AppData\Roaming\Typora\typora-user-images\image-20210607161715736.png
并非 Block 中的所有线程都将遵循相同的控制流路径。
彩色到灰度图像处理示例
RGB 图像
- 图像中的每个像素都是一个 RGB 值
- 图像行的格式是 (r g b) (r g b) … (r g b)
- RGB 范围分布不均
RGB 转灰度图像
灰度数字图像是其中每个像素的值仅携带强度信息的图像。
颜色计算公式
- 对于 (I, J) 处的每个像素 (r g b),执行: grayPixel[I,J] = 0.21r + 0.71g + 0.07*b
- 这只是一个点积 <[r,g,b],[0.21,0.71,0.07]> 常量特定于输入 RGB 空间
RGB 转灰度代码
1 |
|
1 |
|
图像模糊
模糊框
img src=”C:\Users\Aerialith\AppData\Roaming\Typora\typora-user-images\image-20210607162547106.png” alt=”image-20210607162547106” style=”zoom: 80%;” />
2D 内核的图像模糊
1 | __global__ void blurKernel(unsigned char * in, unsigned char * out, int w, int h) { |
1 | __global__ void blurKernel(unsigned char * in, unsigned char * out, int w, int h) { |
线程调度
- 每个块可以相对于其他块以任何顺序执行。
- 硬件可以随时自由地将块分配给任何处理器
- 内核可扩展到任意数量的并行处理器
示例:执行线程块
- 线程以块粒度分配给流式多处理器 (SM)
- 在资源允许的情况下,每个 SM 最多 8 个块
- Fermi SM 最多可以占用 1536 个线程
- 可以是 256(线程/块)* 6 块
- 或 512(线程/块)* 3 个块等。
- SM 维护线程/块 idx # s
- SM 管理/调度线程执行

