CUDA从入门到放弃(五):CUDA线程模型 CUDA Thread Hierarchy

CUDA从入门到放弃(五):CUDA线程模型 CUDA Thread Hierarchy

1 简介

CUDA线程模型精心构建了三个层次:线程(Thread)、线程块(Block)和线程网格(Grid),它们协同工作,共同实现高效的并行计算。

2 线程(Thread)

线程(Thread):作为计算的基本单元,线程承载着实际的计算任务。每个线程都拥有独一无二的ID,这一ID使得线程能够精确地确定自己在所属线程块中的位置。CUDA线程模型巧妙地结合了二维线程块和三维线程网格,通过这种层次化的组织结构,使得大规模并行计算成为可能,从而极大地提升了计算效率。

3 线程块(Block)

线程块(Block):线程块是由多个线程组成的并行执行单元,这些线程共享一些资源,如共享内存,这种共享机制大大简化了线程间的通信与协作。线程块的大小既可以在编译时预先确定,也可以根据实际情况在运行时进行动态调整。每个线程块都具有唯一的块ID,这使得线程能够准确识别自己在块中的位置。

4 线程网格(Grid)

网格(Grid):网格是线程块的集合体,它负责管理和组织线程块。在同一个线程网格中,线程块之间共享全局资源,如全局内存,这使得网格内的线程块能够高效地协同工作,共同处理大规模的数据集。网格的大小同样具备灵活性,既可以在编译时设定,也可以在运行时根据需求进行动态调整。每个线程网格都拥有独特的网格ID,通过这个ID,线程能够清晰地定位自己在整个网格中的位置。
在这里插入图片描述

5 线程块集群(Thread Block Clusters)

线程块集群(Thread Block Clusters)由线程块组成。类似于线程块中的线程保证在流多处理器上协同调度,集群中的线程块也保证在GPU中的GPU处理集群(GPC)上协同调度。

与线程块类似,集群也组织成一维、二维或三维结构。集群中的线程块数量可由用户定义,在CUDA中,集群的最大线程块数支持为8,作为一个可移植的集群大小。

在这里插入图片描述

6 统计直方图示例

#include <stdio.h>  
#include <cuda_runtime.h>  #define N 1000000 // 数组大小  
#define BIN_COUNT 256 // 直方图条目数量  // CUDA内核函数,用于计算直方图  
__global__ void histogramKernel(int *data, int *histogram, int binCount) {  int index = threadIdx.x + blockIdx.x * blockDim.x;  int binIndex = data[index] / (N / binCount); // 计算bin索引  if (index < N) {  atomicAdd(&histogram[binIndex], 1); // 原子操作增加对应bin的计数  }  
}  int main() {  int *h_data, *d_data, *h_histogram, *d_histogram;  h_data = (int*)malloc(N * sizeof(int));  h_histogram = (int*)calloc(BIN_COUNT, sizeof(int));  // 初始化数据(这里仅为示例,实际应用中应有实际数据)  for (int i = 0; i < N; i++) {  h_data[i] = rand() % (BIN_COUNT * (N / BIN_COUNT));  }  // 分配GPU内存  cudaMalloc((void**)&d_data, N * sizeof(int));  cudaMalloc((void**)&d_histogram, BIN_COUNT * sizeof(int));  // 将数据从主机传输到GPU  cudaMemcpy(d_data, h_data, N * sizeof(int), cudaMemcpyHostToDevice);  // 设置CUDA内核的线程块和网格大小  int blockSize = 256;  int gridSize = (N + blockSize - 1) / blockSize;  // 执行CUDA内核函数  histogramKernel<<<gridSize, blockSize>>>(d_data, d_histogram, BIN_COUNT);  // 等待CUDA操作完成  cudaDeviceSynchronize();  // 将直方图结果从GPU传回主机  cudaMemcpy(h_histogram, d_histogram, BIN_COUNT * sizeof(int), cudaMemcpyDeviceToHost);  // 打印直方图结果(仅为示例,实际应用中可能有其他处理方式)  for (int i = 0; i < BIN_COUNT; i++) {  printf("Bin %d: %d\n", i, h_histogram[i]);  }  // 释放内存  free(h_data);  free(h_histogram);  cudaFree(d_data);  cudaFree(d_histogram);  return 0;  
}

参考资料
1 CUDA编程入门
2 CUDA编程入门极简教程
3 CUDA C++ Programming Guide
4 CUDA C++ Best Practices Guide
5 NVIDIA CUDA初级教程视频
6 CUDA专家手册 [GPU编程权威指南]
7 CUDA并行程序设计:GPU编程指南
8 CUDA C编程权威指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/572185.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows python多版本共享方案

1、先安装好python3.11 2、安装好python3.7 这时默认版本是python3.7&#xff0c; A、如果要切换回python3.11则修改环境变量即可 B、 如果想使用3.7&#xff0c;找到python3.7的安装路径 如果想使用3.7 C:\Users\用户\AppData\Local\Programs\Python\Python37 复制python…

js算法记录

> 更多请前往 https://www.passerma.com/article/86 滑动窗口 1 给定一个矩阵&#xff0c;包含N*M个整数&#xff0c;和一个包含K个整数的数组。现在要求在这个矩阵中找一个宽度最小的子矩阵&#xff0c;要求子矩阵包含数组中所有的整数 function minSubmatrixWidth(mat…

如何用Python操作xlsx文件并绘制折线图!

​大家好&#xff0c;数据分析在现代社会越来越重要&#xff0c;而Excel作为数据分析的利器&#xff0c;几乎人手一份。但是&#xff0c;Excel的操作有时候略显繁琐&#xff0c;更是感觉无从下手。 你知道吗&#xff1f;Python这个神奇的工具不仅能帮你处理海量的数据&#xf…

操作系统原理-模拟动态分区首次适应分配和回收算法——沐雨先生

一、实验题目&#xff1a; 模拟动态分区首次适应分配和回收算法 二、实验目的&#xff1a; 通过本实验&#xff0c;可加深理解动态分区分配、回收程序的功能和具体实现&#xff0c;特别是对回收分区的合并的理解。 三、实验环境&#xff1a; 1、硬件&#xff1a;PC机及其兼容…

使用LangChain LCEL生成RAG应用、使用LangChain TruLens对抗RAG幻觉

# 导入LangChain的库 from langchain import *# 加载数据源 loader WebBaseLoader() doc loader.load("https://xxx.html")# 分割文档对象 splitter RecursiveCharacterTextSplitter(max_length512) docs splitter.split(doc)# 转换文档对象为嵌入&#xff0c;并…

从根本上优雅地解决 VSCode 中的 Python 模块导入问题

整体概述&#xff1a; 在我尝试运行 test_deal_file.py 时&#xff0c;我遇到了一个 ModuleNotFoundError 错误&#xff0c;Python告诉我找不到名为 controllers 的模块。这意味着我无法从 deal_file.py 中导入 read_excel 函数。 为了解决这个问题&#xff0c;我尝试了几种方法…

Qt开发(2)——在已有VS项目中配置Qt

在之前的Qt开发学习中&#xff0c;基本都是在Qt Creator中创建一个Qt项目&#xff0c;或者即便是在VS中也是直接新建一个Qt项目。但很少有记录如何在已有的C项目中添加Qt,这就好比我有个项目已经开发完了&#xff0c;现在又说加个Qt界面的功能。这篇文章就是记录如何在已有项目…

2024年4月份 风车IM即时通讯系统APP源码 版完整苹果安卓教程

关于风车IM&#xff0c;你在互联网上能随便下载到了基本都是残缺品&#xff0c; 经过我们不懈努力最终提供性价比最高&#xff0c;最完美的版本&#xff0c; 懂货的朋友可以直接下载该版本使用&#xff0c;经过严格测试&#xff0c;该版本基本完美无缺。 下载地址&#xff1a;…

Matlab|计及电池储能寿命损耗的微电网经济调度

目录 1 主要内容 储能寿命模型 负荷需求响应 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《考虑寿命损耗的微网电池储能容量优化配置》模型&#xff0c;以购售电成本、燃料成本和储能寿命损耗成本三者之和为目标函数&#xff0c;创新考虑储能寿命损耗约…

蓝桥杯2023年第十四届省赛真题:公因数匹配|数论:分解质因数

前置知识&#xff1a; 下列定理证明来自洛谷题解区&#xff1a; B3715 分解质因子 2 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 学习参考、分解质因数模板&#xff1a; 第二十三章 数论——质数&#xff08;1&#xff09;&#xff08;超级详细的推导&#xff09;_数论中…

学点儿数据库_Day11_多表、等值连接、内连接、模糊查找

1 多表 学生表、班级表、课程表、班级课程表 关系型数据库&#xff1a; MySql、SqlServer、Oracle 相同的数据出现多次绝不是一件好事&#xff0c;这是关系数据库设计的基础。关系表的设计就是要把信息分解成多个表&#xff0c;一个数据一个表&#xff0c;各表通过某些共同的…

Python学习笔记------文件操作

编码 编码就是一种规则集合&#xff0c;记录了内容和二进制间进行相互转换的逻辑。 编码有许多中&#xff0c;我们最常用的是UTF-8编码 计算机只认识0和1&#xff0c;所以需要将内容翻译成0和1才能保存在计算机中。同时也需要编码&#xff0c;将计算机保存的0和1&#xff0c…