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

CUDA编程(三):Hello world

CUDA编程(三):Hello world

  • CUDA编程
  • Hello world

CUDA编程

CUDA是Compute Unified Device Architecture的缩写,由英伟达公司2007年开始推出,初衷是为GPU增加一个易用的编程接口,让开发者无需学习复杂的着色语言或者图形处理原语。

CUDA提供两层API供开发者使用:

  • CUDA driver:低级API,较难使用,但是对GPU设备提供了更多的控制。
  • CUDA runtime:基于CUDA driver构建的一套高级API,更容易使用。

Hello world

学习任何一门编程语言,一般都是从Hello world程序入手,在此展示了CUDA编程的Hello world程序代码:

#include<stdio.h>
	
__global__ void hello_world(void){
	printf("GPU:Hello World!\n");
}

int main(void){
	// CPU:Hello World!
	printf("CPU:Hello World!\n");

	// GPU:Hello World!
	hello_world<<<1, 10>>>();
	// 错误处理
	cudaError_t err = cudaGetLastError();
	if (err != cudaSuccess) {
    		printf("CUDA Error: %s\n", cudaGetErrorString(err));
    		// Possibly: exit(-1) if program cannot continue....
	} 
	// 函数cudaDeviceReset()用来显式地释放和清空当前进程中与当前设备有关的所有资源。
	cudaDeviceReset();

	return 0;
}

通常,CPU 调用核函数的同时,会指定执行该核函数的线程块数量和每个线程块中线程的数量。这也就意味着,核函数中的内容会被并行地执行线程块的数量 × 每个线程块内的线程数量次!hello_world <<<1, 10>>>();是调用了10个线程,执行上面的hello_world程序,会打印出10个GPU:Hello World!,这个就是SIMD,即单指令多线程,多个线程执行相同的指令。

在Linux系统中,使用nvidia-smi指令查看是否有NVIDIA加速卡:
在这里插入图片描述

nvcc -V检查nvcc编译器是否正确安装:
在这里插入图片描述

若均有正常输出,则说明已配置好软硬件环境。运行如下指令:

# 编译
nvcc -arch sm_50 hello_world.cu -o hello_world
# 运行
./hello_world

结果如下图所示:
在这里插入图片描述
:查看自己的显卡计算能力(算力)修改sm_50,若使用的算力过高,可能会出现编译不报错,但执行时出现如下报错:

CUDA Error: no kernel image is available for execution on the device

相关文章:

  • Android RenderScript 浅谈
  • SpringBoot+vue的图书管理系统
  • Java SE 基础(3) Java语言概述
  • Spring框架说明
  • 【区块链技术开发】 Solidity使用Truffle Box工具实现预构建模板、自动化部署、创建智能合约示例代码
  • 大事务问题解决方案
  • Microsoft Office 2019(2022年10月批量许可版)图文教程
  • Typora使用
  • ChatGPT自我分析
  • ChatGPT背后的指令学习是什么?PSU最新首篇《指令学习》技术全面综述,详述指令学习关键问题
  • 固态硬盘需要分区吗 固态硬盘怎么分区
  • Linux:进程信号
  • 解决访问客户端位nat模式服务端syn握手失败的问题
  • 【Python】线程
  • 【markdown】markdown语法进阶
  • Android 架构优化~MVP 架构改造
  • Android框架之Volley
  • Angular数据绑定机制
  • git 常用命令
  • javascript面向对象之创建对象
  • JWT究竟是什么呢?
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Netty 4.1 源代码学习:线程模型
  • Python实现BT种子转化为磁力链接【实战】
  • supervisor 永不挂掉的进程 安装以及使用
  • Vue全家桶实现一个Web App
  • Xmanager 远程桌面 CentOS 7
  • 从伪并行的 Python 多线程说起
  • 前端性能优化——回流与重绘
  • 微信小程序--------语音识别(前端自己也能玩)
  • 原生 js 实现移动端 Touch 滑动反弹
  • 怎样选择前端框架
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 如何正确理解,内页权重高于首页?
  • ​2020 年大前端技术趋势解读
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)php新闻发布平台 毕业设计 141646
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (四)模仿学习-完成后台管理页面查询
  • (算法)N皇后问题
  • (学习日记)2024.01.19
  • (译)2019年前端性能优化清单 — 下篇
  • (转)setTimeout 和 setInterval 的区别
  • ******之网络***——物理***
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET MVC第三章、三种传值方式
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .Net 代码性能 - (1)
  • .net(C#)中String.Format如何使用
  • .NET/C# 使窗口永不获得焦点