TensorRT及CUDA自学笔记004 内核函数以及两个简单的内核函数demo

TensorRT及CUDA自学笔记004 内核函数以及两个简单的内核函数demo

内核函数是能够在GPU上被线程并发执行的函数

CUDA程序中的函数修饰符

修饰符执行位置调用注意
global在设备(device)上执行主机和compute capabilitiy 3(计算能力三级)的设备可以调用必须有一个void type的返回值
device在设备(device)上执行只有设备可以调用,只能在设备上执行
host在主机(host)上执行只有主机能调用,只能在主机上执行__host__可以省略,也就是说__host__是默认的修饰符

内核函数的特性

  1. 只能访问GPU memory
  2. 必须返回void type
  3. 不能用变长参数,不能使用静态变量,不能使用函数指针
  4. 有异步性,当内核函数执行时,CPU上的程序可以和内核函数并行执行

demo1 能在GPU上运行并打印信息的内核函数

代码

#include<stdio.h>

__global__ void HellofromGPU(){
    printf("Hello from GPU!\n");
}

int main(){
    printf("Hello from CPU!\n");

    HellofromGPU<<<1,6>>>();//<<<grid,block>>>
    cudaDeviceReset();//释放GPU资源
    return 0;
}

注意:文件后缀名应为.cu

nvcc ./main.cu -o main.exe

然后运行使用nvcc编译的可执行文件

运行结果

luke@ubuntu:~/workspace/TensorRT_course/02_kenel_demo$ ./main.exe
Hello from CPU!
Hello from GPU!
Hello from GPU!
Hello from GPU!
Hello from GPU!
Hello from GPU!
Hello from GPU!

demo2 能在GPU上运行并打印thread 标识和thread ID的内核函数

代码

#include<stdio.h>   
#include<iostream>

__global__ void hellowfromGPU(){
    printf("Hello from block(%d,%d,%d) thread(%d,%d,%d)\t thread ID is %d \n",blockIdx.x,blockIdx.y,blockIdx.z,threadIdx.x,threadIdx.y,threadIdx.z,threadIdx.x  + threadIdx.y * blockDim.x + threadIdx.z * blockDim.x * blockDim.y);
}

int main(){
    std::cout <<"Hello from CPU!"<<std::endl;
    //block被grid包含
    dim3 grid1(2,2,1);//指定name为grid1的grid内部含有2x2x1=4个block块
    dim3 block1(2,2,2);//指定name为block1的block内部含有2x2x2=8个thread
    // printf("Launching kernel width gridDim:%d %d %d blockDim:%d %d %d ",gridDim.x,gridDim.y,gridDim.z,blockDim.x,blockDim.y,blockDim.z);
    // 实际测试发现不能在CPU端直接访问gridDim和blockDim
    std::cout <<"Launching kernel..."<<std::endl;
    hellowfromGPU<<<grid1,block1>>>();//会调用4x8=32个thread并行运行
    //std::cout <<"Work done!"<<std::endl;
    cudaDeviceReset();
    std::cout <<"Work done!"<<std::endl;
    return 0; 
}

注意:文件后缀名应为.cu

nvcc ./main.cu -o main.exe

然后运行使用nvcc编译的可执行文件

运行结果

luke@ubuntu:~/workspace/TensorRT_course/03_cuda_idx$ ./main.exe
Hello from CPU!
Launching kernel...
Hello from block(1,1,0) thread(0,0,0)    thread ID is 0 
Hello from block(1,1,0) thread(1,0,0)    thread ID is 1 
Hello from block(1,1,0) thread(0,1,0)    thread ID is 2 
Hello from block(1,1,0) thread(1,1,0)    thread ID is 3 
Hello from block(1,1,0) thread(0,0,1)    thread ID is 4 
Hello from block(1,1,0) thread(1,0,1)    thread ID is 5 
Hello from block(1,1,0) thread(0,1,1)    thread ID is 6 
Hello from block(1,1,0) thread(1,1,1)    thread ID is 7 
Hello from block(1,0,0) thread(0,0,0)    thread ID is 0 
Hello from block(1,0,0) thread(1,0,0)    thread ID is 1 
Hello from block(1,0,0) thread(0,1,0)    thread ID is 2 
Hello from block(1,0,0) thread(1,1,0)    thread ID is 3 
Hello from block(1,0,0) thread(0,0,1)    thread ID is 4 
Hello from block(1,0,0) thread(1,0,1)    thread ID is 5 
Hello from block(1,0,0) thread(0,1,1)    thread ID is 6 
Hello from block(1,0,0) thread(1,1,1)    thread ID is 7 
Hello from block(0,1,0) thread(0,0,0)    thread ID is 0 
Hello from block(0,1,0) thread(1,0,0)    thread ID is 1 
Hello from block(0,1,0) thread(0,1,0)    thread ID is 2 
Hello from block(0,1,0) thread(1,1,0)    thread ID is 3 
Hello from block(0,1,0) thread(0,0,1)    thread ID is 4 
Hello from block(0,1,0) thread(1,0,1)    thread ID is 5 
Hello from block(0,1,0) thread(0,1,1)    thread ID is 6 
Hello from block(0,1,0) thread(1,1,1)    thread ID is 7 
Hello from block(0,0,0) thread(0,0,0)    thread ID is 0 
Hello from block(0,0,0) thread(1,0,0)    thread ID is 1 
Hello from block(0,0,0) thread(0,1,0)    thread ID is 2 
Hello from block(0,0,0) thread(1,1,0)    thread ID is 3 
Hello from block(0,0,0) thread(0,0,1)    thread ID is 4 
Hello from block(0,0,0) thread(1,0,1)    thread ID is 5 
Hello from block(0,0,0) thread(0,1,1)    thread ID is 6 
Hello from block(0,0,0) thread(1,1,1)    thread ID is 7 
Work done!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

✅技术社区项目—Session/Cookie身份验证识别

session实现原理 SpringBoot提供了一套非常简单的session机制&#xff0c;那么它又是怎么工作的呢? 特别是它是怎么识别用户身份的呢? session又是存在什么地方的呢? 核心工作原理 借助cookie中的 JESSIONID 来作为用户身份标识&#xff0c;这个数据相同的&#xff0c;认…

车载电子电器架构 —— OEM基础技术概念开发流程

车载电子电器架构 —— 基础技术概念开发 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗…

SpringMVC 学习(二)之第一个 SpringMVC 案例

目录 1 通过 Maven 创建一个 JavaWeb 工程 2 配置 web.xml 文件 3 创建 SpringMVC 配置文件 spring-mvc.xml 4 创建控制器 HelloController 5 创建视图 index.jsp 和 success.jsp 6 运行过程 7 参考文档 1 通过 Maven 创建一个 JavaWeb 工程 可以参考以下博文&#x…

吴恩达deeplearning.ai:Tensorflow训练一个神经网络

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai 在之前的博客中。我们陆续学习了各个方面的有关深度学习的内容&#xff0c;今天可以从头开始训练一个神经网络了。 Tensorflow训练神经网络模型 我们使用之前用过的例子&#xff1a; 这个神经…

Python中的functools模块详解

大家好&#xff0c;我是海鸽。 函数被定义为一段代码&#xff0c;它接受参数&#xff0c;充当输入&#xff0c;执行涉及这些输入的一些处理&#xff0c;并根据处理返回一个值&#xff08;输出&#xff09;。当一个函数将另一个函数作为输入或返回另一个函数作为输出时&#xf…

JAVA算法和数据结构

一、Arrays类 1.1 Arrays基本使用 我们先认识一下Arrays是干什么用的&#xff0c;Arrays是操作数组的工具类&#xff0c;它可以很方便的对数组中的元素进行遍历、拷贝、排序等操作。 下面我们用代码来演示一下&#xff1a;遍历、拷贝、排序等操作。需要用到的方法如下 public…

26.HarmonyOS App(JAVA)列表对话框

列表对话框的单选模式&#xff1a; //单选模式 // listDialog.setSingleSelectItems(new String[]{"第1个选项","第2个选项"},1);//单选 // listDialog.setOnSingleSelectListener(new IDialog.ClickedListener() { // Override …

互联网加竞赛 机器视觉opencv答题卡识别系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 答题卡识别系统 - opencv python 图像识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分…

C++中的左值和右值

目录 一. 左值和右值的概念 1. 左值 1.1 可修改的的左值 1.2 不可修改的左值 右值 二. 左值引用和右值引用 1. 左值引用 2. 右值引用 主要用途 1. 移动语义 2. 完美转发 2.1 引用折叠 2.2 std::forward 一. 左值和右值的概念 什么是左值和右值 1. 左值 左值是一个表示…

Unity3D 使用 Proto

一. 下载与安装 这里下载Google Protobuff下载 1. 源码用来编译CSharp 相关配置 2. win64 用于编译 proto 文件 二. 编译 1. 使用VS 打开 2. 点击最上面菜单栏 工具>NuGet 包管理器>管理解决方案的NuGet 管理包 版本一定要选择咱们一开始下载的对应版本否则不兼容&am…

使用免费的L53巧解Freenom域名失效问题

进入2月份以来&#xff0c;不少小伙伴纷纷收到Freenom提供的域名失效&#xff0c;状态由正常变成了Pending。 失效后&#xff0c;域名无法使用&#xff0c;免费的午餐没有了&#xff0c;而现在域名的价格也是水涨船高&#xff0c;真是XXX。很多做外贸的小伙伴表示 难 啊&#x…

树状数组与线段树<2>——线段树初步

这个系列终于更新了(主要因为树状数组初步比较成功) 话不多说&#xff0c;切入正题。 什么是线段树&#xff1f; 线段树是一种支持单点修改区间查询(树状数组也行) and 区间修改单点查询(树状数组不行) and 区间修改区间查询(树状数组更不行)的高级数据结构&#xff0c;相当…

Chiplet技术与汽车芯片(二)

目录 1.回顾 2.Chiplet的优势 2.1 提升芯片良率、降本增效 2.2 设计灵活&#xff0c;降低设计成本 2.3 标准实行&#xff0c;构建生态 3.Chiplet如何上车 1.回顾 上一篇&#xff0c;我们将来芯粒到底是什么东西&#xff0c;本篇我们来看芯粒技术的优势&#xff0c;以及它…

5.1 Ajax数据爬取之初介绍

目录 1. Ajax 数据介绍 2. Ajax 分析 2.1 Ajax 例子 2.2 Ajax 分析方法 &#xff08;1&#xff09;在网页页面右键&#xff0c;检查 &#xff08;2&#xff09;找到network&#xff0c;ctrl R刷新 &#xff08;3&#xff09;找 Ajax 数据包 &#xff08;4&#xff09;…

多线程相关(4)

线程安全-下 使用层面锁优化减少锁的时间&#xff1a;减少锁的粒度&#xff1a;锁粗化&#xff1a;使用读写锁&#xff1a;使用CAS&#xff1a; 系统层面锁优化自适应自旋锁锁消除锁升级偏向锁轻量级锁重量级锁 ThreadLocal原理ThreadLocal简介原理ThreadLocal内存泄漏 HashMap…

VMware使用虚拟机,开启时报错:无法连接虚拟设备 0:0,因为主机上没有相应的设备。——解决方法

检查虚拟机配置文件并确保物理设备已正确连接。 操作&#xff1a; 选中虚拟机&#xff0c;打开设置&#xff0c;点击CD/DVD。在连接处选择使用ISO镜像文件

fpga_硬件加速引擎

一 什么是硬件加速引擎 硬件加速引擎&#xff0c;也称硬件加速器&#xff0c;是一种采用专用加速芯片/模块替代cpu完成复杂耗时的大算力操作&#xff0c;其过程不需要或者仅需要少量cpu参与。 二 典型的硬件加速引擎 典型的硬件加速引擎有GPU&#xff0c;DSP&#xff0c;ISP&a…

【二分查找】【浮点数的二分查找】【二分答案查找】

文章目录 前言一、二分查找&#xff08;Binary Search&#xff09;二、浮点数的二分查找三、二分答案总结 前言 今天记录一下基础算法之二分查找 一、二分查找&#xff08;Binary Search&#xff09; 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找目…

1 Nacos数据持久化方式

Nacos 支持两种数据持久化方式&#xff0c;一种是利用内置的数据库&#xff0c;另一种是利用外置的数据源。 1、内置数据库支持 Nacos 默认内置了一些数据存储解决方案&#xff0c;如内嵌的 Derby 数据库。 这种内置方式主要用于轻量级或测试环境。 2、外置数据库支持 对于生…

【RN】学习使用 Reactive Native内置UI组件

简言 当把导航处理好后&#xff0c;就可以学习使用ui组件了&#xff08;两者没有先后关系&#xff0c;个人习惯&#xff09;。 在 Android 和 iOS 开发中&#xff0c;一个视图是 UI 的基本组成部分&#xff1a;屏幕上的一个小矩形元素、可用于显示文本、图像或响应用户输入。甚…