ljg2np 发表于 2024-11-7 09:30

关于GPU编程的讨论

<p>图形处理器(Graphics Processing Unit,&nbsp;GPU)和中央处理器(Central Processing Unit,&nbsp;CPU)相对,是显卡的核心芯片;统一计算设备架构(Compute Unified Device Architecture,&nbsp;CUDA),是由英伟达(NVIDIA)推出的通用并行计算架构,作为开发GPU的编程接口,CUDA通过CPU任务分发和GPU并行处理来提升计算效率。</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

ljg2np 发表于 2024-11-7 09:57

<p>在CUDA平台下,CPU和GPU是如何分工协作的?</p>

<p>1. CPU负责任务调度和管理。</p>

<p>2. GPU负责并行计算:使用大量CUDA核心执行任务,完成大规模向量计算。</p>

<p>3. 数据交换:CPU和GPU之间存在数据交换,GPU显存决定并行处理规模和计算速度。</p>

ljg2np 发表于 2024-11-7 10:42

<p></p>


<p>cuDNN是NVIDIA提供的针对深度神经网络基元的一个优化&nbsp;GPU&nbsp;库,这些基元包括前向传播、卷积、反向传播、激活函数(如&nbsp;sigmoid、ReLU&nbsp;和&nbsp;tanh)和梯度下降,cuDNN&nbsp;是大多数主流深度神经网络框架(如&nbsp;Tensorflow)在&nbsp;NVIDIA&nbsp;GPU&nbsp;上的底层支撑。</p>

ljg2np 发表于 2024-11-7 11:00

本帖最后由 ljg2np 于 2024-11-7 14:22 编辑

<p>&nbsp;</p>

<p>GPU硬件的一个核心组件是SM(Streaming Multiprocessor,流式多处理器),SM采用的是SIMT(Single-Instruction, Multiple-Thread,单指令多线程)架构,CUDA&nbsp;Warp(线程束)是CUDA中的最小执行单元,由&nbsp;32&nbsp;个线程或更少组成,运行在精确的32个GPU核心上,就像网格由块组成一样,块由Warps组成,Warp的多少取决于块使用的线程数。</p>

wangerxian 发表于 2024-11-7 13:09

<p>CUDA是英伟达非常伟大的设计。</p>

ljg2np 发表于 2024-11-7 14:13

<p>GPU与CPU通过PCIe总线连接,CPU一侧称为主机端(host),GPU一侧称为设备端(device);CUDA是NVIDIA公司开发的GPU编程模型,它提供了GPU编程的简易接口,基于CUDA编程可以构建基于GPU计算的应用程序。CUDA程序的执行流程如下:</p>

<p>1、分配host内存,并进行数据初始化;</p>

<p>2、分配device内存,并从host将数据拷贝到device上;</p>

<p>3、调用CUDA的核函数在device上完成指定的运算;</p>

<p>4、将device上的运算结果拷贝到host上;</p>

<p>5、释放device和host上分配的内存。</p>

ljg2np 发表于 2024-11-7 14:17

<div class='shownolgin' data-isdigest='no'>wangerxian 发表于 2024-11-7 13:09
CUDA是英伟达非常伟大的设计。

<p>分布式并行计算技术一直在发展,英伟达通过CUDA将显卡芯片发展为GPU,极大降低了普通用户参与AI实现的门槛。</p>
</div><script>showreplylogin();</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

ljg2np 发表于 2024-11-7 14:40

<div class='shownolgin' data-isdigest='no'> 本帖最后由 ljg2np 于 2024-11-8 09:31 编辑

<p data-pid="g-e9s8LK">在CUDA中通过函数类型限定词区分host和device上的函数,kernel(核函数)是在device上线程中并行执行的函数,用_global__符号声明;在device上执行时启动很多线程,一个kernel启动的所有线程称为一个网格(grid),同一个网格上的线程共享相同的全局内存空间,网格分为很多线程块(block),每个块包含了若干线程。主要的三个函数类型限定词如下:</p>

<p data-pid="g-e9s8LK">&nbsp; &nbsp; 1、__global__在device上执行,从host中调用,返回类型是void,不能成为类成员函数;</p>

<p data-pid="g-e9s8LK">&nbsp; &nbsp; 2、__device__在device上执行,仅在device中调用,不和_global__同时用;</p>

<p data-pid="g-e9s8LK">&nbsp; &nbsp; 3、__host__在host上执行,仅在host上调用,可省略不写,不和_global__同时用,可和__device__一起使用,函数在device和host都被编译。</p>
</div><script>showreplylogin();</script>

zpw0316 发表于 2024-11-7 17:11

<div class='shownolgin' data-isdigest='no'><table cellpadding="0" cellspacing="0">
        <tbody>
                <tr>
                        <td>
                        <p>能不能描述清楚一点?485通信速率难道不是波特率决定的吗?</p>
                        </td>
                </tr>
        </tbody>
</table>
</div><script>showreplylogin();</script>

ljg2np 发表于 2024-11-8 09:42

<div class='shownolgin' data-isdigest='no'><p>在pyTorch中调用GPU的两种方法:</p>

<p>1、调用model.cuda(),将模型加载到GPU;</p>

<p>2、调用model.to(device),这种方式应用较多。</p>
</div><script>showreplylogin();</script>

ljg2np 发表于 2024-11-8 11:18

<div class='shownolgin' data-isdigest='no'>zpw0316 发表于 2024-11-7 17:11
能不能描述清楚一点?485通信速率难道不是波特率决定的吗?

<p>波特率的概念更为普遍适用,不止RS485,对RS422、RS232都可以采用的;对于GPU来说,它本身是作为显卡的芯片,侧重于图形处理和显示器适配的,随着芯片技术的发展,增强了性能,引入了并行计算功能,而且借助于显示器是电脑的标配的缘故,很方便的得到了应用和推广;实际上,它并不是专门从事并行、分布、集群的超大规模计算的。</p>
</div><script>showreplylogin();</script>

ljg2np 发表于 2024-11-8 11:23

<div class='shownolgin' data-isdigest='no'><p>GPU的出现和提出,很大程度上促进和推动了一些领域和行业的发展,尤其是对于人工智能领域的参与,使其受到了普遍的关注,促进了计算机领域的改革和发展。</p>
</div><script>showreplylogin();</script>
页: [1]
查看完整版本: 关于GPU编程的讨论