CUDA与GPU编程

news2024/9/23 1:20:15

文章目录

  • CUDA与GPU编程
    • 1. 并行处理与GPU体系架构
      • 1.1 并行处理简介
        • 1.1.1 串行处理与并行处理的区别
        • 1.1.2 并行处理的概念
        • 1.1.3 常见的并行处理
      • 1.2 GPU并行处理
        • 1.2.1 GPU与CPU并行处理的异同
        • 1.2.2 CPU的优化方式
        • 1.2.3 GPU的特点
      • 1.3 环境搭建

CUDA与GPU编程

1. 并行处理与GPU体系架构

1.1 并行处理简介

image-20231121215539658

image-20231121215559617

计算机基本硬件组成

image-20231121221143386

多CPU: 是指简单的多个CPU工作在同一个系统上,多个CPU之间的通讯是通过主板上的总线进行的

多核 :是指一个CPU有多个核心处理器,处理器之间通过CPU内部总线进行通讯。

image-20231121221225795

进程和线程

image-20231121221424405

进程:是操作系统(OS)进行资源(CPU、内存、磁盘、IO、带宽等)分配的最小单位。一个进程就是一个程序的运行实例
启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫进程,例如:打开一个浏览器、一个聊天窗口分别是一个进程。进程可以有多个子任务,如聊天工具接收消息、发送消息,这些子任务成为线程。
线程: 是CPU调度和分配的基本单位。操作系统会根据进程的优先级和线程的优先级去调度CPU。
线程数: 是一种逻辑概念,是模拟出的CPU核心数 。
进程和线程的关系描述如下:

  • 进程可以简单理解为一个容器有自己独立的地址空间。一个进程可由多个线程的执行单元组成,每个线程都运行在同一进程的上下文中,共享进程该地址空间以及其内的代码和全局数据等资源即线程之间共享进程中的数据
  • 每个进程至少有一个主线程,它无需由用户主动创建,一般由系统自动创建。系统创建好进程后,实际上就启动了执行该进程的执行主线程,执行主线程以函数地址形式,即程序入口函数(如 main函数),将程序的启动点提供给操作系统。主执行线程终止或关闭,进程也就随之终止,操作系统会回收改进程所占用的资源
  • 进程中的任意一线程执行出错,都会导致整个进程的崩溃。
  • 进程之间的内容相互隔离。进程隔离是为保护操作系统中进程互不干扰的技术,每一个进程只能访问自己占有的数据,也就避免出现进程 A 写入数据到进程 B 的情况。正是因为进程之间的数据是严格隔离的,所以一个进程如果崩溃了,或者挂起了,是不会影响到其他进程的。如果进程之间需要进行数据的通信,这时候,就需要使用用于进程间通信(IPC)的机制了。
  • 严格讲应该是线程能够获得CPU资源,进程对CPU资源的获取也是体现在线程上的。CPU内核数,和进程线程没直接关系。操作系统(OS)可以把某个进程部署在某个CPU核上,但这取决于系统设计。
  • 进程、线程都是由操作系统调度的,线程只是由进程创建,但是进程本身不会负责调度线程。在操作系统看来,线程和进程其实差不多,不同点是线程是迷你的进程,并且进程可以包含多个线程
  • 对于内存堆内存、代码区一般属于一个进程,但是栈(执行栈)却是属于一个线程的,且每个线程拥有一个独立的栈。
1.1.1 串行处理与并行处理的区别
  1. 串行处理(Serial Processing):

    • 指令/代码块依次执行任务按顺序依次执行,一个任务完成后才会开始下一个任务。

    • 串行处理是指在一个特定的时间点上,只有一个任务在执行。

    • 这意味着任务之间相互等待,执行时间较长的任务会影响整体性能。一般来说,当程序有数据依赖or分支等这些情况下需要串行

  2. 并行处理(Parallel Processing):

    • 并行处理是指在同一时刻多个任务可以同时执行。
    • 任务被分成多个子任务,这些子任务可以在多个处理单元(例如多核处理器或分布式系统中的多台计算机)上并行执行。
    • 并行处理可以显著提高任务的执行速度和系统的性能。
    • 指令/代码块同时执行
    • 充分利用multi-core(多核)的特性,多个core一起去完成一个或多个任务
    • 使用场景:科学计算,图像处理,深度学习等等

在并行处理中,任务之间可以是相互独立的,也可以是相互依赖的。并行处理通常需要额外的硬件支持和编程技巧来管理任务之间的同步和数据共享。

总之:

  • 串行处理是按顺序执行任务,而并行处理是同时执行多个任务。
  • 并行处理通常用于加速计算和提高系统性能,特别是在需要处理大量数据或计算密集型任务时。
1.1.2 并行处理的概念

​ 在计算机科学中,“并行处理” 是指同时执行多个任务或操作的技术。它利用多个处理单元或线程来并发执行任务,从而提高程序的执行速度。在 Python 中,我们可以利用多线程、多进程或异步编程等技术来实现并行处理。

1.1.3 常见的并行处理
  1. 多核处理器(Multi-Core Processors):
    • 多核处理器包含多个CPU核心,每个核心可以独立执行指令。这意味着多个任务可以在不同核心上并行执行。
    • 多核处理器常见于现代计算机和移动设备,使多线程应用程序可以更有效地运行。
  2. 并行计算集群(Parallel Computing Clusters):
    • 并行计算集群是由多台计算机组成的网络,它们可以协同工作来解决大规模计算问题。
    • 每台计算机都可以处理一部分任务,通过网络通信和协作,实现任务的并行执行。
  3. GPU并行处理(GPU Parallel Processing):
    • 图形处理单元(GPU)在图形渲染之外也可用于一般计算任务。它们具有大量的小型处理单元,适合并行计算。
    • GPU计算用于加速科学计算、深度学习、机器学习等领域。
  4. 分布式计算(Distributed Computing):
    • 分布式计算是将任务分发给多台计算机,这些计算机可能位于不同地理位置。
    • 通过分布式系统,可以同时处理大规模数据集或执行计算密集型任务。
  5. SIMD(Single Instruction, Multiple Data)并行性:
    • SIMD是一种并行处理技术,其中一条指令同时作用于多个数据元素。
    • SIMD通常用于多媒体处理和向量计算,如图像处理和音频处理。
  6. 多线程并发(Multithreading):
    • 多线程技术允许在同一程序中创建多个线程,每个线程可以执行不同的任务。
    • 多线程并发可用于处理并行性较低的任务,如GUI应用程序和服务器。
  7. 数据流并行性(Dataflow Parallelism):
    • 数据流并行性是一种并行处理模型,其中任务的执行取决于数据的可用性。
    • 当数据可用时,相关任务可以并行执行,而无需严格的同步。

并行化处理是将一个任务分解成多个子任务,每个子任务可以独立地进行处理。这样可以提高处理速度和效率。

  1. 分治法:将大问题分解成若干小问题,并且这些小问题可以独立地进行计算,最后将结果合并得到答案。
  2. 数据划分法:将数据划分成多份,每份数据可以独立地进行计算,最后将结果合并得到答案。
  3. 流水线法:将一个任务分为若干阶段,每个阶段可以独立地进行计算,并且不同阶段之间的数据传输要尽可能快。
  4. 线程池技术:在程序启动时创建一定数量的线程,并放入线程池中,当需要执行某个任务时从线程池中取出一个线程来执行,执行完毕后再归还给线程池。
  5. OpenMP库:OpenMP是一个针对共享内存架构的并行编程API标准。它支持C、C++和Fortran等语言,在代码中使用预处理器指令就能够实现多线程编写。
  6. MPI库:MPI(Message Passing Interface)是一种消息传递编程模型,在分布式系统上实现进程间通信。MPI库适用于各种形式的并行计算,包括集群、超级计算机和网格计算等。

Python 提供了多个并行处理库,其中一些常用的库包括:

  1. multiprocessing:这个内置库提供了跨平台的多进程支持,可以使用多个进程并行执行任务。
  2. threading:这个内置库提供了多线程支持,可以在同一进程内使用多个线程并行执行任务。
  3. concurrent.futures:这个标准库提供了高级的并行处理接口,可以使用线程池或进程池来管理并发任务的执行。
  4. joblib:这是一个流行的第三方库,提供了简单的接口来并行执行 for 循环,尤其适用于科学计算和机器学习任务。
  5. dask:这是一个灵活的第三方库,提供了并行处理和分布式计算的功能,适用于处理大规模数据集。

1.2 GPU并行处理

1.2.1 GPU与CPU并行处理的异同

相同点:

  1. 并行性支持: GPU和CPU都支持并行处理,但它们的并行性方式有所不同。
  2. 计算能力: GPU和CPU都可以执行计算任务,但GPU在某些特定类型的计算任务上表现更出色。

不同点:

  1. 体系结构: GPU和CPU具有不同的体系结构。CPU通常具有较少的核心(一般为几个到几十个),而GPU具有大量的小型核心(通常为数百到数千个)。这使得GPU在同时处理大规模数据时更具优势。
  2. 用途: CPU通常用于一般计算任务,如操作系统管理、文件处理和串行计算。而GPU主要设计用于图形渲染,但也在科学计算、深度学习和机器学习等需要大规模并行计算的领域中得到广泛应用。
  3. 指令集: CPU具有复杂的通用指令集,适用于各种计算任务。GPU的指令集通常较简单,适用于执行相同操作的大量数据。
  4. 内存层次结构: CPU通常具有更大、更快速的高速缓存,适用于较小的数据集。GPU通常具有大量的全局内存,适用于处理大规模数据集。
  5. 编程模型: 编写针对GPU的并行代码通常需要使用特定的编程模型,如CUDA(用于NVIDIA GPU)或OpenCL。而CPU上的并行编程通常使用多线程和多进程来实现。
  6. 功耗和散热: GPU通常在相对较高的功耗下运行,因为它们的设计重点是性能。相比之下,CPU通常更注重功耗效率和散热控制。

综上所述,GPU和CPU都支持并行处理,但它们在体系结构、用途、指令集、内存层次结构和编程模型等方面存在显著差异。选择使用哪种处理器取决于具体的计算任务和性能需求。在一些情况下,GPU可以显著加速大规模并行计算,而CPU则更适用于通用计算和较小规模的任务。

1.2.2 CPU的优化方式
  1. 多核利用: 如果计算机使用多核CPU,确保充分利用所有核心。编写多线程应用程序或使用并行编程框架来将任务分发到多个核心上,以提高性能。
  2. 高性能编程语言: 选择使用高性能编程语言,如C++或Rust,以编写计算密集型应用程序。这些语言通常具有更好的性能优化支持。
  3. 编译器优化: 使用优化的编译器选项来生成高效的机器码。编译器可以进行各种优化,包括内联函数、循环展开和代码重排。
  4. CPU指令级优化: 利用CPU的特定指令集扩展,如SSE(Streaming SIMD Extensions)或AVX(Advanced Vector Extensions),以加速特定类型的计算任务。
  5. 缓存优化: 编写代码时考虑缓存的层次结构,尽量减少缓存未命中。这包括循环访问数组时考虑局部性,并使用缓存友好的数据结构。
  6. 减少分支: 避免过多的条件分支,因为分支可能导致流水线停滞。优化代码以减少分支预测错误的可能性。
  7. 循环优化: 对于性能关键的循环,进行循环展开、循环重排和循环剥离等优化,以提高指令级并行性。
  8. 数据并行性: 使用SIMD指令和向量化编程,以在单个指令中处理多个数据元素,从而提高并行性。
  9. 内存优化: 减少内存访问次数,使用局部变量和缓存数据以减少内存延迟。
  10. 多线程并发: 利用多线程来并行执行任务,特别是在多核CPU上。使用线程池或并发框架来管理线程。
  11. 性能分析工具: 使用性能分析工具(如Profiling工具)来识别性能瓶颈,并根据分析结果进行优化。
  12. 硬件加速: 对于某些计算密集型任务,可以考虑使用GPU或专用硬件加速器来提高性能。
  13. 避免不必要的同步: 减少线程之间的同步操作,以避免竞态条件和锁竞争,从而提高性能。
  14. 优化算法: 选择适当的算法和数据结构,以减少计算复杂度,从而提高性能。
  15. 定时和调度: 了解操作系统的定时和调度机制,以便优化任务的调度和响应时间。
1.2.3 GPU的特点

1.3 环境搭建

lspci| grep

image-20231122004123783

lsb_release -a 
nvidia-smi

1.全面掌握「进程与线程、并发并行与串行、同步与异步、阻塞与非阻塞」的区别

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

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

相关文章

思维模型 潘多拉效应

本系列文章 主要是 分享 思维模型 ,涉及各个领域,重在提升认知。越是禁止,越是好奇。 1 潘多拉效应的应用 1.1 潘多拉效应在管理中的应用 通用电气公司曾经推出了一项名为“六西格玛”的管理方法,该方法旨在通过优化业务流程和提…

土地利用数据技术服务

一、背景介绍 土地是人类赖以生存与发展的重要资源和物质保障,在“人口-资源-环境-发展(PRED)”复合系统 中,土地资源处于基础地位。随着现代社会人口的不断增长以及工业化、城市化进程的加速&a…

所有权成果输出(宗地基本信息表、界址标示表、界址签章表、界址点成果表、宗地图、界址说明表、调查审核表)

一、软件界面: 二、软件功能:主要实现批量生成不动产权籍调查表、宗地基本信息表、界址标示表、界址签章表、界址点成果表、宗地图、界址说明表、调查审核表。(本次宗地包含内外环宗地) 三、所有权成果要求(宗地基本信息表、界址标示表、界址签章表…

创作4周年

🙌秋名山码民的主页 😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 获取源码,添加WX 目录 前言机…

工业一体全国产方案,米尔T113核心板

入门级HMI屏作为嵌入式系统中重要组成部分,大部分都是串口屏;其功能简单、成本低等特点,使用历史悠久、应用广泛,而随着信息技术的快速发展,行业需求不断升级,工程师使用了大量串口屏后,发现串口…

操作系统 day13(RR、优先级调度)

RR(时间片轮转) 响应时间:系统中有10个进程正在并发执行,如果时间片为1秒,则一个进程被响应可能需要等待9秒。也就是说,如果用户在自己进程的时间片外通过键盘发出调试命令,可能需要等待9秒才能…

大厂面试官最爱问的20道Mysql面试题

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

thinkphp6生成PDF自动换行

composer安装 composer require tecnickcom/tcpdf 示例 use TCPDF;public function info($university,$performance,$grade,$major){//获取到当前域名$domain request()->domain();//实例化$pdf new TCPDF(P, mm, A4, true, UTF-8, false);// 设置文档信息$pdf->SetCr…

Redis高可用之主从复制及哨兵模式

一、Redis的主从复制 1.1 Redis主从复制定义 主从复制是redis实现高可用的基础,哨兵模式和集群都是在主从复制的基础之上实现高可用; 主从复制实现数据的多级备份,以及读写分离(主服务器负责写,从服务器只能读) 1.2 主从复制流…

多线程的实现方式

点击链接返回标题-> Java线程的学习-CSDN博客 第一种方式,继承Thread类 Thread类是java.lang包下的类,是多线程经常需要使用的类。 ①通过自定义子类去继承Thread类,并重写其中的run()方法。 class myThread extends Thread {//自定义子类…

hive return code 40000 from org.apache.hadoop.hive.ql.exec.MoveTask解决思路

参考学习 https://github.com/apache/hive/blob/2b57dd27ad61e552f93817ac69313066af6562d9/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java#L47 为啥学习error code 开发过程中遇到以下错误,大家觉得应该怎么办?从哪方面入手呢? 1.百…

51单片机利用I/O口高阻状态实现触摸控制LED灯

51单片机利用I/O口高阻状态实现触摸控制LED灯 1.概述 这篇文章介绍使用I/O口的高阻状态实现一个触摸控制LED灯亮灭的实验。该实验通过手触摸P3.7引脚,改变电平信号控制灯的亮灭。 2.实验过程 2.1.实验材料 名称型号数量单片机STC12C20521LED彩灯无1晶振12MHZ1电…

【git】使用ssh

前言 git之前一直使用https,因为很方便随时随地都可以用。最近把代码托管到GitHub,使用https就使用不了。后面听同事说GitHub使用ssh是没问题的,就想着尝试一下。 git ssh配置 设置用户名和邮箱 git config --global use.name username g…

一条Update语句的执行过程是怎样的?

先看第一个问题,这里做个简单描述 ,因为我们着重还是看Update MySQL执行一条Select语句是怎么运行的? 这个问题大家在面试的时候大家都背过类似的题,而且网上也有很多答案,这里分享一个大致流程介绍,关于…

通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示

通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示 #include <ros/ros.h> #include <signal.h> #include <sensor_msgs/Image.h> #include <message_filters/subscriber.h> #include <message_filters/synchronizer.h> #include &…

国外网站文章或网页采集翻译为中文

采集国外网站的文章或网页数据&#xff08;例如英文&#xff0c;西班牙语&#xff0c;法语等&#xff09;&#xff0c;怎么快速批量翻译为中文&#xff1f; 可以使用简数采集器来实现&#xff0c;支持自动翻译&#xff0c;同时翻译为多种语言&#xff08;不仅中文&#xff09;…

(C++)反转字符串中的单词

愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/reverse-w…

分享一个课程卡样式

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 广告打完&#xff0c;我们进入正题&#xff0c;先看效果&#xff1a; 废话不多&#xff0c;上源码&#xff1a; <body><h3 c…

Java飞翔的鸟游戏

一.准备工作 首先创建一个新的Java项目命名为“飞翔的鸟”&#xff0c;并在src中创建一个包命名为“com.qiku.bird"&#xff0c;在这个包内分别创建4个类命名为“Bird”、“BirdGame”、“Column”、“Ground”&#xff0c;并向需要的图片素材导入到包内。 二.代码呈现 …

Spring-jdbcTemplate-配置数据库连接池,配置文件方式beans.xml

1、jdbc.properties jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql:///studb jdbc.userroot jdbc.pwd123456 2、beans.xml <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans&…