当前位置: 首页 > news >正文

1、第一个CUDA代码:hello gpu

目录

  • 第一个CUDA代码:hello gpu
    • 一、__global__ void GPUFunction()
    • 二、gpu<<<1,1>>>();
    • 三、线程块、线程、网格知识
    • 四、核函数中的printf();
    • 五、cudaDeviceSynchronize();

第一个CUDA代码:hello gpu

#include <stdio.h>void cpu()
{printf("hello cpu!\n");
}__global__ void gpu()
{printf("hello gpu!\n");
}int main()
{cpu();gpu<<<1,1>>>();cudaDeviceSynchronize();
}

一、global void GPUFunction()

1.global (限定符)关键字表明以下函数将在GPU上运行并全局调用,而在此种情况下,则由CPU或GPU调用。
2.通常,我们将在CPU上执行的代码称为主机代码,而将在GPU上运行的代码称为设备代码。
3.注意返回类型为void,使用__global__ 关键字定义的核函数需要返回void类型
4.限定符__global__和void的次序可随意,如void global GPUFunction()

二、gpu<<<1,1>>>();

1.通常,当调用要在GPU上运行的函数时,我们将此函数称为已启动的核函数。
2.启动核函数时,我们必须提供执行配置,即在向核函数传递任何预期参数之前使用<<<…>>>语法完成的配置。
3.在宏观层面,我们可通过执行配置为核函数启动指定线程层次结构,从而定义线程组(称为线程块)的数量,以及要在每个线程块中执行的线程数量。稍后深入探讨,现在是正在使用1线程(第二个配置参数)的1线程块(第一个执行配置参数)启动核函数

三、线程块、线程、网格知识

调用核函数时为什么需要这对三括号里面的信息呢?
因为一个GPU中有很多计算核心(如Tesla V100有5120个),可以支持很多线程(thread)。主机在调用一个核函数时,必须指明需要在设备中指派多少线程,否则设备不知道如何工作。
三括号中的数就是用来指明核函数中的线程数目及排列情况。
核函数中的线程常组织为若干线程块(thread block):三括号中的第一个数字为线程块个数,第二个数字为每个线程块中的线程数。一个核函数的全部线程构成一个网格(grid),而线程块的个数为网格大小(grid size)。每个线程块中含有同样数目的线程,该数目称为线程块大小(block size)。所以,核函数中总的线程数就等于网格大小乘以线程块大小,<<<网格大小,线程块大小>>>。

四、核函数中的printf();

1.使用方法和C+++库一样
2.包含头文件<stdio.h>或
3.核函数中不支持c++的iostream

五、cudaDeviceSynchronize();

CUDA的API函数,如果去掉不能输出字符串。
原理是调用此函数时,输出流是先存放在缓冲区的,而缓冲区不会自动刷新。只有程序遇到某种同步操作时缓冲区才会刷新。函数的作用是同步主机与设备,所以能够促使缓冲区刷新。
通俗说是此函数将主机CPU代码暂做等待,直至设备GPU代码执行完成,才能在CPU恢复执行。

http://www.lryc.cn/news/6814.html

相关文章:

  • UG二次开发装配篇 添加/拖动/删除组件方法的实现
  • 【ros bag 包的设计原理、制作、用法汇总】
  • Linux网络:聚合链路技术
  • 2023年数据安全的下一步是什么?
  • 在浏览器输入URL后发生了什么?
  • Dubbo学习
  • CMMI-立项管理流程
  • 看《狂飙》读人生,致敬2023!
  • Web自动化测试——Junit5篇
  • Seata源码学习(二)-源码入口
  • 2023如何选购适合游戏设计的电脑硬件
  • springboot maven项目集成阿里p3c-pmd插件使用
  • PowerJob的server启动都经历了哪些?代码不多也很简单,咱们来逐一理解。
  • 分享好玩的h5小游戏制作步骤_怎么做h5微信小游戏
  • 代理模式--设计模式
  • 【RSTP的原理和配置】
  • Doom流量回放工具导致的测试环境服务接口无响应的排查过程
  • 2023年留学基金委(CSC)西部/地方合作项目选派办法及解读
  • ILSSI国际研讨会将为您呈现六西格玛技术的未来与前景
  • KDJ日周月金叉共振指标
  • 线程私有变量ThreadLocal详解
  • 如何保证数据库和缓存双写一致性
  • 一文搞懂:JS严格模式“use strict”
  • Linux的ACL(扩展权限)规划:setfacl、getfacl
  • HTML预格式化文本pre标签
  • 基于机器学习的心脏病预测方法(11)——梯度提升机(GBM)
  • Linux多版本python切换以及多版本pip对应 (cloud studio Ubuntu16.04)
  • 【并发编程】LockSupport源码详解
  • 元宇宙之声:新鸿基公司
  • Linux中定时监控Tomcat服务器进程并在进程结束时重启Tomcat服务器