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

CUDA C编程权威指南:1-基于CUDA的异构并行计算

  什么是CUDA?CUDA(Compute Unified Device Architecture,统一计算设备架构)是NVIDIA(英伟达)提出的并行计算架构,结合了CPU和GPU的优点,主要用来处理密集型及并行计算。什么是异构计算?这里的异构主要指的是主机端的CPU和设备端的GPU,CPU更擅长逻辑控制,而GPU更擅长计算。CUDA编程难吗?干就是了。

一.异构架构编程思维
1.异构架构
  一个典型的异构计算节点包括2个多核CPU插槽和2个或更多个的众核GPU。GPU通过PCIe总线与基于CPU的主机相连来进行操作。CPU是主机端,而GPU是设备端,这样一个异构应用就包含主机代码(逻辑)和设备代码(计算)。

2.CUDA平台
  CUDA平台可以通过CUDA加速库、编译器指令、应用编程接口以及行业标准程序语言的扩展(包括C|C++|Fortran|Python等)来使用。CUDA提供了2层API来管理GPU设备和组织线程,其中驱动API是一种低级API,它相对来说较难编程,但是它对于在GPU设备使用上提供了更多的控制,每个运行时API函数都被分解为更多传给驱动API的基本运算。



二.Hello World例子实战
1.VS 2022开发方式
  安装好VS 2022和CUDA 11.8,然后创建一个CUDA项目,如下所示:



  Hello World例子实战,如下所示:

#include "cuda_runtime.h" // CUDA
#include "device_launch_parameters.h"
#include <stdio.h>__global__ void helloFromGPU(void)
{printf("Hello World from GPU!\n");
}int main(void) 
{// hello from cpuprintf("Hello World from GPU!\n");helloFromGPU<<<1,10>>>();cudaDeviceReset();return 0;
}

2.Clion开发方式(推荐)
  如果经常使用PyCharm进行Python编程,可能会更习惯Clion这个IDE吧。新建一个CUDA项目,使用10个线程输出"Hello World from GPU!",如下所示:


  CMakeLists.txt如下所示:

cmake_minimum_required(VERSION 3.26) # CMake版本要求,VERSION是版本,3.26是3.26版本
project(20231003_ClionProgram CUDA) # 项目名称,CUDA是CUDA项目set(CMAKE_CUDA_STANDARD 17) # C++标准,CMAKE_CUDA_STANDARD是C++标准,17是C++17add_executable(20231003_ClionProgram main.cu) # 可执行文件set_target_properties(20231003_ClionProgram PROPERTIES CUDA_SEPARABLE_COMPILATION ON) # 设置可分离编译,PROPERTIES是属性,CUDA_SEPARABLE_COMPILATION是可分离编译,ON是开启

  main.cu文件如下所示:

#include "cuda_runtime.h" // CUDA运行时API
#include <stdio.h> // 标准输入输出__global__ void helloFromGPU(void) // GPU核函数
{printf("Hello World from GPU!\n"); //输出Hello World from GPU!
}int main(void) // 主函数
{// hello from cpuprintf("Hello World from GPU!\n"); //CPU主机端输出Hello World from CPU!helloFromGPU<<<1,10>>>(); // 调用GPU核函数,10个线程块,1表示每个grid中只有1个block,10表示每个block中有10个线程cudaDeviceReset(); // 重置当前设备上的所有资源状态,清空当前设备上的所有内存return 0;
}

参考文献:
[1]《CUDA C编程权威指南》

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

相关文章:

  • R语言易错点(持续更新中~~)
  • Multisim14.0仿真(二十七)基于UC3842的反激式开关电源的设计及仿真
  • SpringMVC(二)@RequestMapping注解
  • NXP公司K60N512+PWM控制BLDC电机
  • CAA的VS Studio安装
  • 条件查询和数据查询
  • JSP旅游平台管理
  • 简单走近ChatGPT
  • 10.3作业
  • Springboot中的@Import注解~
  • Linux 安全 - SUID机制
  • Nginx与Spring Boot的错误模拟实践:探索502和504错误的原因
  • 全志ARM926 Melis2.0系统的开发指引①
  • 2024级199管理类联考之数学基础(下篇)
  • HTML之如何下载网页中的音频(二)
  • 【现代机器人学】学习笔记十四:中文版印刷/翻译勘误
  • [架构之路-229]:计算机体硬件与系结构 - 计算机系统的矩阵知识体系结构
  • 第一章 visual studio下载安装
  • 【服务器】在 Linux CLI 下安装 Anaconda
  • Python中Lambda用法
  • nodejs+vue养老人员活体鉴权服务系统elementui
  • 解决caffe中的python环境安装的问题(补充)
  • 面试常用排序查找算法
  • CUDA C编程权威指南:1.1-CUDA基础知识点梳理
  • 讲讲项目里的仪表盘编辑器(四)分页卡和布局容器组件
  • Qt模块、Qt开发应用程序类型、Qt未来主要市场、Qt6功能普及
  • nodejs+vue高校校图书馆elementui
  • CUDA C编程权威指南:1.2-CUDA基础知识点梳理
  • C语言—位运算符
  • 怎么才能实现一个链接自动识别安卓.apk苹果.ipa手机和win电脑wac电脑