CUDA线程层次一文搞懂|参加CUDA线上训练营

news2024/11/13 14:42:22

设备术语

  • Host:CPU 和 内存 (host memory)
  • Device:GPU 和显存 (device memory)

在这里插入图片描述

CUDA 线程层次

CUDA 线程层次分为:

  • Thread
    • 所有线程执行相同的核函数
    • 并行执行
  • Thread Block
    • 执行在一个 Streaming Multiprocessor (SM)
    • 同一个 Block 中的线程可以协作
  • Thread Grid
    • 一个 Grid当中的 Block 可以在多个 SM 中执行

CUDA执行顺序

  1. 加载核函数
  2. 将 Grid 分配到一个 Device
  3. 根据 <<<..>>> 内的执行设置的第一个参数,Giga threads engine 将 block 分配到 SM 中。一个 Block 内的线程一定会在同一个 SM 内,一个 SM 可以有很多个 Block
  4. 根据 <<<..>>> 内的执行设置的第二个参数,Warp 调度器会将调用线程
  5. Warp 调度器为了提高运行效率,会将每 32 个线程分为一组,称作-个 warp
  6. 每个 warp 会被分配到 32 个 core 上运行

在这里插入图片描述

CUDA 的一切精髓就是并行加速冲冲冲!

如何计算索引

首先来看看基本概念:

  • threadIdx.[x y z]是执行当前kernel函数的线程在block中的索引值(threadIdx.x是1,threadIdx.y是0)

  • blockIdx.[x y z]是指执行当前kernel函数的线程所在block,在grid中的索引值(blockIdx.x是1,blockIdx.y是1)

  • blockDim.[x y z]表示一个block中包含多少个线程(blockDim.x是5,blockDim.y是3)

  • gridDim.[x y z]表示一个grid中包含多少个block(gridDim.x是3,gridDim.y是2)

在这里插入图片描述
计算矩阵运算的时候,将矩阵中的一行取出来,但是因为 CUDA 是多个线程并行的,就是每个线程里面都会同时获取到矩阵行中的某个元素,我们就需要在核函数里面计算出来这个元素在原来矩阵行中的索引,下面是个例子:
在这里插入图片描述

Demo

接下来,我们通过完成一个向量加法的实例来实践一下: 。

为了完成这个程序,我们先要将数据传输给GPU,并在GPU完成计算的时候,将数据从GPU中传输给CPU内存。这时我们就需要考虑如何申请GPU存储单元,以及内存和显存之前的数据传输。

我们利用cudaMalloc()来进行GPU存储单元的申请,利用cudaMemcpy()来完成数据的传输

代码如下:

#include <math.h>
#include <stdio.h>

void __global__ add(const double *x, const double *y, double *z, int count)
{
    const int n = blockDim.x * blockIdx.x + threadIdx.x;
	if( n < count)
	{
	    z[n] = x[n] + y[n];
	}

}
void check(const double *z, const int N)
{
    bool error = false;
    for (int n = 0; n < N; ++n)
    {
        if (fabs(z[n] - 3) > (1.0e-10))
        {
            error = true;
        }
    }
    printf("%s\n", error ? "Errors" : "Pass");
}


int main(void)
{
    const int N = 1000;
    const int M = sizeof(double) * N;
    double *h_x = (double*) malloc(M);
    double *h_y = (double*) malloc(M);
    double *h_z = (double*) malloc(M);

    for (int n = 0; n < N; ++n)
    {
        h_x[n] = 1;
        h_y[n] = 2;
    }

    double *d_x, *d_y, *d_z;
    cudaMalloc((void **)&d_x, M);
    cudaMalloc((void **)&d_y, M);
    cudaMalloc((void **)&d_z, M);
    cudaMemcpy(d_x, h_x, M, cudaMemcpyHostToDevice);
    cudaMemcpy(d_y, h_y, M, cudaMemcpyHostToDevice);

    const int block_size = 128;
    const int grid_size = (N + block_size - 1) / block_size;
    add<<<grid_size, block_size>>>(d_x, d_y, d_z, N);

    cudaMemcpy(h_z, d_z, M, cudaMemcpyDeviceToHost);
    check(h_z, N);

    free(h_x);
    free(h_y);
    free(h_z);
    cudaFree(d_x);
    cudaFree(d_y);
    cudaFree(d_z);
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python快速上手系列--异常处理--详解篇

本章所说的就是我们经常遇到的一个问题&#xff0c;报错、异常。我们应该如何处理&#xff0c;让它不影响后面的程序运行。异常首先我们看看一个简单的示例。print(2/0)其结果可想而知&#xff0c;当然是报错了&#xff01;程序被终止了&#xff01;这里会提示用户&#xff0c;…

索引-性能分析-慢查询日志

索引语法 1、创建索引时候 [UNIQUE | FULLTEXT] 关键字是可选的&#xff1b; 1&#xff09;加上 UNIUQE 就是创建唯一索引&#xff08;唯一索引&#xff0c;说明改字段不能出现重复数据&#xff09;&#xff1b; 2&#xff09;加上FULLTEXT 创建的是一个全文索引&#xff1b;…

Webpack5 环境下 Openlayers 标注(Icon) require 引入图片问题

Webpack5 环境下 Openlayers 标注&#xff08;Icon&#xff09; require 引入图片问题环境版本Openlayers 使用 require 问题Webpack5 正确配置构建新环境的时候&#xff0c;偶然发现 Openlayers 使用 require 的方式加载图片&#xff08;Icon&#xff09;报错&#xff0c;开始…

电子技术——DC偏移

电子技术——DC偏移 因为差分放大器是直接耦合的并且对于DC有着有限的增益&#xff0c;因此本节我们讨论差分放大器在DC相关方面的问题。 MOS差分放大器的输入偏移电压 考虑下面的电路&#xff0c;我们将MOS差分放大器的输入端都置地&#xff1a; 此时假如电路完全对称&#…

IP地址:揭晓安欣警官自证清白的黑科技

《狂飙》这部电视剧&#xff0c;此从播出以来可谓是火爆了&#xff0c;想必大家都是看过的。剧中&#xff0c;主人公“安欣”是一名警察。一直在与犯罪分子做斗争。 莽村的李顺案中&#xff0c;有匿名者这个案件在网上发帖恶意造谣&#xff0c;说安欣是黑恶势力的保护伞&#…

将视频作为桌面动态壁纸,只需要两步,让你保存的视频在桌面动起来,动态壁纸工具,视频动态壁纸,小风车,桌面美化工具

这款软件可以让你宝贵的视频资源变成动态壁纸显示在你的电脑上&#xff0c;体积小巧&#xff0c;不需要安装&#xff0c;即点即用。 一、软件简介 这是一款可以将视频文件作为动态壁纸展示在电脑桌面的软件&#xff0c;它体积小巧&#xff0c;占用资源也不多&#xff0c;相比…

SpringMVC基础入门(一)之理论基础概念

文章目录SpringMVC1.概念2.常用注解请求与响应1.请求参数2.JSON传输3.常用注解响应1.响应页面2.响应JSON数据Rest风格1.介绍2.常用注解SpringMVC 1.概念 &#xff08;1&#xff09;定义 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架。 &#xff08;2&#xff09;为什…

test2

物理层故障分析 一、传输介质故障 a.主要用途简述 传输介质主要分为 导向传输介质和非导向传输介质。前者包括双绞线&#xff08;两根铜线并排绞合&#xff0c;距离过远会失真&#xff09;、同轴电缆&#xff08;铜质芯线屏蔽层&#xff0c;抗干扰性强&#xff0c;传输距离更…

VScode查看python f.write()的文件乱码

VScode查看python f.write()的文件乱码 在使用 VScode 编写 python 代码&#xff0c; print&#xff08;&#xff09;&#xff0c;汉字正常显示&#xff0c; 使用 with open&#xff08;&#xff09;as f&#xff1a; f.write&#xff08;&#xff09;文件后&#xff0c; 在 …

【Java】HashMap原理

哈希表&#xff08;Hash table&#xff09; 也叫散列表&#xff0c;是根据键&#xff08;Key&#xff09;而直接访问在内存存储位置的数据结构。也就是说&#xff0c;它通过计算一个关于键值的函数&#xff0c;将所需查询的数据映射到表中一个位置来访问记录&#xff0c;这加快…

nvm安装后出现‘node‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

出现这个问题多半是path地址不对。 打开系统环境变量。看看path里面有没有&#xff1f;没有的话&#xff0c;加上就行&#xff01; 我的报错原因就是因为path里没有自动加上nvm的相关路径。 注意项&#xff1a; 1&#xff0c;在安装nvm之前&#xff0c;提前要把本机以前安装…

剑指 Offer 32 - II. 从上到下打印二叉树 II(java解题)

剑指 Offer 32 - II. 从上到下打印二叉树 II&#xff08;java解题&#xff09;1. 题目2. 解题思路3. 数据类型功能函数总结4. java代码5. 踩坑记录1. 题目 从上到下按层打印二叉树&#xff0c;同一层的节点按从左到右的顺序打印&#xff0c;每一层打印到一行。 例如: 给定二叉…

2023年开始,为什么公司运营依赖于流程文档?

当您的业务扩展时&#xff0c;您会得到越来越多的活动部件&#xff0c;跟踪复杂性是某人的工作。人员和任务需要以最有成效的方式组织&#xff0c;您必须找到某种方式让员工知道如何执行有效完成工作所需的流程。为了使过程可重复&#xff0c;需要将其记录在案。有人需要写下你…

关于conda env导出yaml无法create的问题解决

在使用conda env 命令创建package 列表之后&#xff0c;无法用yml文件创建新的环境。 这是因为在环境导出的时候没有加--no-builds 这个选项。 conda env export 正确的导出环境的做法如下&#xff1a; conda env export --no-builds > environment.yml--no-builds 的作用…

(C语言)自定义类型,枚举与联合

问&#xff1a;1. 结构体在自引用的时候不能怎么样&#xff1f;可以怎么样&#xff1f;2. Solve the problems&#xff1a;自定义一个学生结构体类型&#xff0c;要包含姓名&#xff0c;性别&#xff0c;年龄&#xff0c;六科成绩&#xff0c;家乡&#xff08;也为结构体&#…

服务器开发29:Kubernetes (K8S)上手简单实践(2/13)

文章目录一、Kubernetes (K8S) 简介1&#xff09;简介2&#xff09;主要特性&#xff1a;3&#xff09;学习前提4&#xff09;不同部署方案5&#xff09;为什么需要K8S6&#xff09;K8S集群架构7&#xff09;Kubernetes 组件二、安装k8s集群1&#xff09;安装方式介绍2&#xf…

python笔记-- “__del__”析构方法

-#### 1、基本概念&#xff08;构造函数与析构函数&#xff09; 特殊函数&#xff1a;由系统自动执行&#xff0c;在程序中不可显式地调用他们 构造函数&#xff1a; 建立对象时对对象的数据成员进行初始化&#xff08;对象初始化&#xff09; 析构函数&#xff1a; 对象生命期…

【IPD】集成产品开发培训课程「3月4-5日」

课程名称集成产品开发&#xff08;Integrate Product Development&#xff09;参加对象企业CEO/总经理、产品总监、研发总监/副总、总工/技术总监、市场总监、制造总监、采购总监、产品经理/研发项目经理、研发管理部/技术管理部经理、流程管理部/质量管理部经理、项目管理及质…

Spring Cloud alibaba之Feign

JAVA项目中如何实现接口调用&#xff1f;HttpclientHttpclient是Apache Jakarta Common下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持Http协议的客户端编程工具包&#xff0c;并且它支持HTTP协议最新版本和建议。HttpClient相比传统JDK自带的URL Connection&a…

Java对象内存布局及对象头详解

对象在堆内存中布局 平常我们都在使用对象&#xff0c;现在从底层角度来分析下java对象的内存布局&#xff0c;以及对象布局各部分含义。 周志明老师JVM第三版的定义&#xff1a; 在HotSpot虚拟机里&#xff0c;对象在堆内存中的存储布局可以划分为三个部分:对象头&#xff…