CUDA Review

1.  GPU硬件特性

1.1 存储层次

1.1.1 Global memory

1) 大小一般为几GB

2)  chip-offDRAM介质存储器

3) 访问速度慢(是shared memory的上百倍)

4)  对于是否对齐和连续访问敏感(由DRAM的性质决定)(Remember:When using global memory to read and write a large matrix/array, errors occurred sometimes.)

5) 可以被所有的线程访问

1.1.2 Shared memory

1) 每个SM中一般几十KB

2) chip-onSRAM介质存储器

3) 访问速度快(与register相当)

4) 对于是否对其和连续访问不敏感,但是对bank conflict敏感(由bank设计决定)

5) 只对自身block中的线程可见

1.1.3 Register

1) 每个SM中一般为几千个(约30K

2) Chip-on的寄存器

3) 访问速度最快

4) 只对每个thread本身可见

1.1.4 Other

 Local memory

1) 每个线程有512KB(计算能力2.x),或者16KB(计算能力1.x

2) Chip-off的存储器,与global memory类似

3) 访问速度慢(与global memory类似)

4) 由编译器控制,存放寄存器溢出的自动变量

5) 只对每个thread本身可见

 Texture memory

 大小为6-8KB

 Constant memory

 大小为64KB

1.2 执行层次

1.2.1 逻辑

1) Grid:由block构成,维数及维度可以设置,所有的blockGrid中并行执行

2) Block:由thread够层,维数及维度可以设置,同一个block中的thread并行执行

3) Thread:由threadId识别,每个thread有自己的寄存器,私有变量,共享同一个block中的shared memory

1.2.2 物理

1) SM:由多个流处理器组成,每个SM有独立的资源,包括:block槽,warp槽,thread槽,shared memoryregister

2) Warp:由32thread组成,每次执行的时候,32thread动作一致,如果有分支,则串行执行

3) Thread:物理上属于warp,与其他thread一同,组成最小的执行单元warp,拥有自己的寄存器

1.3 GPU优化原则

1.3.1 访存方式

1) Global memory尽量让一个warp中的线程访问连续的一个内存块,实现级联访问(合并访问)

2) Shared memory尽量减少bank conflict,让同一个warp中的线程访问不同的bank

1.3.2 数据分块

1) Shared memory block:在SM能够支持的情况下,尽量多地利用此资源提高局部重用性

2) Register memory:在shared memory之上可以多加一层寄存器层,进一步提高重用性(寄存器的带宽和延迟都优于共享内存)

1.3.3 限制分支

1) Warp divergence尽量减少分支判断,将同一个分支中的thread尽量放在同一个warp

1.3.4 提高计算密度

1) Instruction throughput一方面提高warp的效率,让warp充分用到function unit,尽量接近理论峰值;另一方面可以降低非运算类的比例,使得指令更多地用于计算

1.4 GPU优化策略

1.4.1级联访存

1) Global memory:将线程组织称为可以一次性访问一个warp中内容的形式

1.4.2 共享内存

2) Shared memory:减少bank conflict来加快对shared memory的访问

1.4.3 重组线程

1) 将各个分支中的线程进行重组,让同一个warp中的线程尽量地走同一个分支

1.4.4 指令流水线

1) 对指令进行分类,分析每一类指令的吞吐量,减少混合指令

1.4.5 指令调度

1) 将长延迟的指令插入到与该指令独立的计算密集点处,使用计算来隐藏延迟(一般为访存造成的延迟)

1.5 GPU优化实现

1.5.1 CGMAcompute to global memory access

1) 计算:浮点数操作/访存操作,能够比较准确地体现kernel的性能,在访存性能一定的时候,通过提高CGMA的值可以使得浮点操作的性能大幅提升(浮点操作的峰值性能远远超过访存的峰值带宽)

2) 例子:CGMA=1.0,则浮点操作的性能最好的时候也就跟访存性能一致,而G80global memory的带宽为86.4GB/s,但是其浮点计算的峰值性能却为367Gflops,这样,性能将被访存速度所约束

1.5.2 减少global memory的流量

1) 将具有局部重用性的数据块加载到每个block中的shared memory中,减少对global memory的频繁访问,提高读取数据的性能

2) 例子:矩阵乘法的分块实现,利用shared memory来存储每一小块所需的数据及结果

1.5.3 存储器的使用需要谨慎

1) 如果每个线程使用得存储器过多,将会直接导致每个SM上可以驻留的线程数减少,造成并行度不足的问题

2) 例子:G80中每个SM8K的寄存器,16Kshared memory,如果每个块分配的shared memory超过了2K,则SM中驻留的块将无法达到全部的8个,降低并行度,寄存器也是同样的道理

1.5.4 Warp divergence的问题

1) 一个warp中的线程存在分支的时候,会造成串行执行不同分支,降低性能,可以通过调整线程执行内容来减少warp中存在的分支,提高性能

2) 例子:tid 2造成了每个warp中都有分支,换成了tid stride后,将直接消除了几乎所有分支

1.5.5 Global memory带宽

1) 由于global memory是有DRAM组成,所以,访问的速度慢,而每次访问将会返回连续的一段数据(硬件设计决定),所以,为了接近峰值,应该坚持每次访问都对连续的单元进行访问(即合并访问)

2) 例子:矩阵的行优先转换成列优先,可以一次性读取连续的单元,提高效率;如果warp访问的是global memory中的连续单元,则该访问将会被合并成一次性访问

1.5.6 SM资源的动态划分(分块大小的策略)

1) GT200中,每个SM最多驻留1024个线程,8个块,可以划分为4*256,也可以划分成8*128,但是后者更能充分地利用线程槽和块槽,效率将会更高

2) 寄存器数目可能造成的性能悬崖:GT200种每个SM8192个寄存器,对于16*16的线程块,如果每个线程用到的寄存器为10个,那么可以容纳3个块,如果每个线程用到的寄存器为11个,则只能容纳2个块,这种情况可能极大地降低并行度,造成性能退化

3) 说明:上面描述的情况也不一定降低性能,如果一个寄存器能够使得独立的浮点操作数大幅提高,那么,就算少了一个块,也能够有充分的warp来隐藏延迟

4) 问题:寄存器溢出是在寄存器不够用的情况下出现的,按照上面的说法,寄存器如果不够用,会减少块的个数来避免这个问题,那么什么时候将会溢出?另一方面,寄存器溢出会造成对local memory的访问,降低性能,但是没有想象中的低,因为Fermi已经为local memory提供了缓冲

1.5.7 数据预取

1) 当所有的线程都在等待存储器访问结果的时候,延迟将没有办法被隐藏,这个时候,可以调整处理过程为:使用当前元素时,预取下一个元素,隐藏延迟(书中观点是:在读取global memoryshared memory中的这个过程中间,插入了独立的计算指令,有效地隐藏延迟)

2) 例子:将原来读取global memoryshared memory的过程拆分成global memoryregister,再从registershared memory,这样,从global memory读取下一块到register的时候,就可以同时计算当前块,隐藏延迟了

1.5.8 混合指令的消除

1) 对于循环,往往混合了多种指令:取址,分支,计数,运算,而指令的混合将会降低执行效率,可以通过消除这种混合来提高指令的执行效率

2) 例子:将循环次数不多的循环体直接展开称为长的表达式,消除指令的混合

1.5.9 线程粒度调整

1) 提高线程的粒度有时候能够降低访存的次数,因为其提高了数据的重用性,当然,期间不可避免.


In a word, latency is the key word of CUDA. How to cover the latency is difficult to all CUDAers.

Learning CUDA is easy while learning it well is difficult.


related URL:

http://tech.it168.com/a2011/0706/1213/000001213855.shtml

http://blog.youkuaiyun.com/ouczoe/article/details/5137063

基于STM32 F4的永磁同步电机无位置传感器控制策略研究内容概要:本文围绕基于STM32 F4的永磁同步电机(PMSM)无位置传感器控制策略展开研究,重点探讨在不依赖物理位置传感器的情况下,如何通过算法实现对电机转子位置和速度的精确估计与控制。文中结合嵌入式开发平台STM32 F4,采用如滑模观测器、扩展卡尔曼滤波或高频注入法等先进观测技术,实现对电机反电动势或磁链的估算,进而完成无传感器矢量控制(FOC)。同时,研究涵盖系统建模、控制算法设计、仿真验证(可能使用Simulink)以及在STM32硬件平台上的代码实现与调试,旨在提高电机控制系统的可靠性、降低成本并增强环境适应性。; 适合人群:具备一定电力电子、自动控制理论基础和嵌入式开发经验的电气工程、自动化及相关专业的研究生、科研人员及从事电机驱动开发的工程师。; 使用场景及目标:①掌握永磁同步电机无位置传感器控制的核心原理与实现方法;②学习如何在STM32平台上进行电机控制算法的移植与优化;③为开发高性能、低成本的电机驱动系统提供技术参考与实践指导。; 阅读建议:建议读者结合文中提到的控制理论、仿真模型与实际代码实现进行系统学习,有条件者应在实验平台上进行验证,重点关注观测器设计、参数整定及系统稳定性分析等关键环节。
### 如何通过复习有效重新学习 有效的复习和重新学习是一个复杂的过程,涉及记忆巩固、知识提取以及认知负荷管理等多个方面。以下是关于如何通过复习方法实现高效重新学习的关键要点: #### 记忆巩固的重要性 人类的记忆分为短期记忆和长期记忆。为了使新学的知识能够被牢固存储并随时调用,需要定期激活这些记忆痕迹。间隔重复是一种经过验证的方法,它利用遗忘曲线理论来优化复习时间表[^1]。 #### 主动回忆与测试效应 主动回忆是指不查看材料的情况下尝试记住所学内容的行为。研究表明,相比于被动重读,这种方法能显著提高记忆力保持率。这是因为当人们努力去检索某个信息时,大脑会建立更强的神经连接。 #### 多样化练习策略 单一类型的反复练习虽然可以短期内提升表现,但从长远来看并不如多样化练习那样持久有效。混合不同形式的任务可以让学生更全面地掌握技能,并增强迁移能力——即把学到的东西应用到新的情境中的能力。 #### 使用技术工具辅助学习 现代科技提供了许多有助于个人化的自适应学习平台和技术手段,比如基于算法推荐最佳复习时机的应用程序;还有像上述提到过的参数设置(`--quantization_bit`, `--flash_attn`) 这样的高级模型配置选项可以帮助加速自然语言处理任务的学习过程,从而间接支持教育领域内的智能化教学方案开发. ```python import torch from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("/root/weights/Mixtral-8x7B-Instruct-v0.1") model = AutoModelForCausalLM.from_pretrained( "/root/weights/Mixtral-8x7B-Instruct-v0.1", load_in_4bit=True, device_map='auto' ) def generate_text(prompt): inputs = tokenizer.encode(prompt, return_tensors="pt").to('cuda') outputs = model.generate(inputs, max_length=50) result = tokenizer.decode(outputs[0], skip_special_tokens=True) return result if __name__ == "__main__": prompt = "What is the capital of France?" response = generate_text(prompt) print(response) ``` 此代码片段展示了如何加载预训练的语言模型并通过指定量化位数(`load_in_4bit=True`) 来减少内存消耗同时维持性能水平,这类似于采用高效的复习技巧以节省精力却仍能达到良好效果的理念。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值