【CUDA】线程配置

devtools/2024/11/8 21:26:43/

一、 线程层次结构

1.1 认识

GPU 可并行执行工作

Thread:所有线程执行相同的核函数,并行执行

Thread Block:执行在一个Streaming Multiprocessor (SM),同一个Block中的线程可以协作

线程的集合称为块,块的数量很多。每个 block 的线程数是有限制的,因为 block 的所有线程都驻留在同一个流式多处理器内核上,并且必须共享该内核的有限内存资源。在当前 GPU 上,一个线程块最多可以包含 1024 个线程

Thread Grid:一个Grid中的Block可以在多个SM中执行

与给定核函数启动相关联的块的集合被称为网格

GPU 函数称为核函数,核函数通过执行配置启动,执行配置定义了网格中的块数以及每个块中的线程数,网格中的每个块均包含相同数量的线程

启动并行运行的核函数

可通过执行配置指定有关如何启动核函数以在多个 GPU 线程中并行运行的详细信息。即可通过执行配置指定线程组(称为线程块或简称为块)数量以及其希望每个线程块所包含的线程数量

执行配置的语法如下:

<<< NUMBER_OF_BLOCKS, NUMBER_OF_THREADS_PER_BLOCK>>>

启动核函数时,核函数代码由每个已配置的线程块中的每个线程执行

若假设已定义一个名为 someKernel 的核函数:

  • someKernel<<<1, 1>>() 配置为在具有单线程的单个线程块中运行后,将只运行一次
  • someKernel<<<1, 10>>() 配置为在具有10线程的单个线程块中运行后,将运行10次
  • someKernel<<<10, 1>>() 配置为在10个线程块(均具有单线程)中运行后,将运行10次
  • someKernel<<<10, 10>>() 配置为在10个线程块(均具有10线程)中运行后,将运行100次

1.2 线程层次结构变量

  • 网格(Grid):一个网格由多个线程块组成,这些线程块可以在一维、二维或三维空间中排列。网格的大小由 dim3 gridDim 变量指定,其中 gridDim.x、gridDim.y和gridDim.z 分别表示网格在x、y和z轴上的大小

  • 线程块(Block):一个线程块包含多个线程,这些线程在同一个SM(Streaming Multiprocessor)上并发执行。线程块的大小由 dim3 blockDim 变量指定,其中 blockDim.x、blockDim.y和blockDim.z 分别表示线程块在x、y和z轴上的大小

  • 线程(Thread):每个线程块中的线程都有一个唯一的线程ID,由 threadIdx 变量表示。同样,每个线程块在网格中也有一个唯一的块ID,由 blockIdx 变量表示

blockIdx.x 就是当前线程块在网格x轴上的索引。若网格是一维的,blockIdx.x 就足够用来唯一标识每个线程块了。若网格是二维或三维的,还需要使用 blockIdx.y和blockIdx.z 来分别表示线程块在y轴和z轴上的索引

dim3 grid(3,2,1), block(5,3,1)的线程分布示意图:

cuda线程在cuda core上执行,block在sm上执行,grid在整个device上执行

二、 协调并行线程

元素数量与线程数匹配

假设数据位于索引为 0 的向量中,由于某种未知原因,必须映射每个线程以处理向量中的元素

公式 threadIdx.x + blockIdx.x * blockDim.x 可将每个线程映射到向量的元素中

threadIdx.x的取值为0到3,blockIdx.x的取值为0到1,blockDim.x的取值为4

元素数量小于线程数

上述这种场景中,网络中的线程数与元素数量完全匹配,若线程数超过要完成的工作量,该怎么办?尝试访问不存在的元素会导致运行时错误

鉴于 GPU 的硬件特性,所含线程的数量为 32 的倍数的线程块是最理想的选择,此时具备性能上的优势。假设要启动一些线程块且每个线程块中均包含 256 个线程(32 的倍数),并需运行 1000 个并行任务(此处使用极小的数量以便于说明),则任何数量的线程块均无法在网格中精确生成 1000 个总线程,因为没有任何整数值在乘以 32 后可以恰好等于1000

  • 编写执行配置,使其创建的线程数超过执行分配工作所需的线程数
  • 将一个值作为参数传递到核函数 (N) 中,该值表示要处理的数据集总大小或完成工作所需的总线程数
  • 计算网格内的线程索引后(使用 threadIdx + blockIdx * blockDim),请检查该索引是否超过 N,并且只在不超过的情况下执行与核函数相关的工作

以下是编写执行配置的惯用方法示例,适用于 N 和线程块中的线程数已知,但无法保证网格中的线程数和 N 之间完全匹配的情况。可确保网格中至少始终拥有 N 所需的线程数,且超出的线程数至多不会超过 1 个线程块的线程数量:

// Assume `N` is known
int N = 100000;
// Assume we have a desire to set `threads_per_block` exactly to `256`
size_t threads_per_block = 256;
// Ensure there are at least `N` threads in the grid, but only 1 block's worth extra
size_t number_of_blocks = (N + threads_per_block - 1) / threads_per_block;some_kernel<<<number_of_blocks, threads_per_block>>>(N);
__global__ some_kernel(int N)
{int idx = threadIdx.x + blockIdx.x * blockDim.x;if (idx < N) // Check to make sure `idx` maps to some value within `N`{// Only do work if it does}
}

元素数量大于线程数

数据元素数量往往会大于网格中的线程数。在此情况下,线程无法只处理一个元素

以编程方式解决此问题的其中一种方法是使用网格跨度循环,在网格跨度循环中,线程的第一个元素依旧使用 threadIdx.x + blockIdx.x * blockDim.x 计算得出。然后,线程会按网格中的线程数 (blockDim.x * gridDim.x) 向前迈进,直至其数据索引超出数据元素的数量,所有线程均按此种方式运作,如此便会涵盖所有元素

__global void kernel(int *a, int N)
{int indexWithinTheGrid = threadIdx.x + blockIdx.x * blockDim.x;int gridStride = gridDim.x * blockDim.x;for (int i = indexWithinTheGrid; i < N; i += gridStride){// do work on a[i];}
}

二维情况获取线程index


http://www.ppmy.cn/devtools/132397.html

相关文章

【记录分享】多任务黑客攻击仿真模拟器

在电影和电视剧中&#xff0c;黑客攻击的场景往往充满了紧张、快速的打字声和不断滚动的命令行界面。为了让这种体验更具沉浸感&#xff0c;我们可以通过编程模拟出一个真实的黑客攻击过程。本篇文章将介绍如何使用 Python 和 Tkinter 库设计一个多任务黑客攻击仿真模拟程序&am…

数据分析:16s扩增子网络分析之SparCC

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍共表达网络分析SPARCC算法安装NetCoMi加载R包数据链接导入数据数据预处理network constructionnetwork analysis - degree centralitynetwork plots - degree centralitynetwork co…

外包功能测试就干了4周,技术退步太明显了。。。。。

先说一下自己的情况&#xff0c;大专生&#xff0c;21年通过校招进入武汉某软件公司&#xff0c;干了差不多3个星期的功能测试&#xff0c;那年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我才在一个外包企业干了4周的功…

C# 几个基础位运算

通过使用二进制位&#xff08;bit)来做开关&#xff0c;是个不错的选择。 使用二进制作为开关&#xff0c;主要是针对不同的位进行赋值 1或者 0。 在实现这个功能之前&#xff0c;先来复习几个知识点&#xff1a; 位逻辑非运算&#xff08;~&#xff09;&#xff1a;1变0&…

传统RAG流程;密集检索器,稀疏检索器:中文的M3E

目录 传统RAG流程 相似性搜索中:神经网络的密集检索器,稀疏检索器 密集检索器 BGE系列模型 text-embedding-ada-002模型 M3E模型 稀疏检索器 示例一:基于TF-IDF的稀疏检索器 示例二:基于BM25的稀疏检索器 稀疏检索器的特点与优势 传统RAG流程 相似性搜索中:神经…

ICT网络赛道安全考点知识总结3

关于SSL VPN的特点的描述如下&#xff1a; 由于SSL VPN登录方式借助了浏览器&#xff0c;所以实现了客户端的自动安装和配置&#xff0c;这样用户可以随时随地用设备快捷登录&#xff0c;同时也缓解了网络管理员维护客户端等方面的压力。 SSL VPN针对内网资源可以解析到应用层&…

MySQL 【流程控制】函数

目录 1、CASE 语句用于流程控制中的多分支情况。 2、IF() 函数根据测试条件是否为真分别返回指定的值。 3、IFNULL() 函数&#xff0c;如果第一个参数为 NULL&#xff0c;返回第二个参数&#xff0c;否则返回第一个参数。 4、NULLIF() 函数根据两个参数是否相等决定返回 NUL…

数字身份发展趋势前瞻:身份韧性与安全

身份韧性与安全是身份与访问管理IAM发展的重要趋势&#xff0c;身份既是防御者的盾牌&#xff0c;也是攻击者的目标。面对日益复杂的网络威胁和不断增长的身份盗窃风险&#xff0c;身份韧性与安全不仅仅涉及产品的防御能力&#xff0c;还包括应对突发事件、快速恢复的弹性和灵活…