#01 原理 前文中我们已经描述过MLP列并行与行并行的基础原理。简单回顾一下: 权重按列切:输入不能切分,得到的是结果,shape是不完整的,最终的结果需要all-gat...
#01 原理 前文中我们已经描述过MLP列并行与行并行的基础原理。简单回顾一下: 权重按列切:输入不能切分,得到的是结果,shape是不完整的,最终的结果需要all-gat...
#01基础概念 张量并行是一种模型并行策略,它将神经网络层的权重矩阵在不同设备间进行分割,使每个设备只负责部分计算,从而实现并行处理。在MLP中,主要通过两种方式实现张量并行...
#01 基础原理 在前面的文章中,我们已经知道,shared memory 访存是通过 memory transaction (内存事务)进行的,一个 memory tran...
#01 背景 在前文的讨论中,我们分析了一个warp内的每个线程访问4个Byte的情况,这样所有线程发起一次读写请求,可以访问到128 Byte的 Shared Memory...
#01 前情回顾 前面的文章中,我们简单分析了shared memory Bank Conflict的基础概念,本文我们来对如何避免Bank冲突进行分析。 需要注意的是,不同...
CUDA共享内存是一种位于GPU芯片上的高速内存,其读写带宽远高于全局内存(约10倍以上),读写延迟也显著降低(约20~30倍)。这使得共享内存成为CUDA编程中提升性能的关...
登陆huggingface账户 通过snapshot_download下载模型 如果需要登陆token: modelscope模型下载 hf格式转gguf gguf量化 典型...
观感 Rust的Trait和Golang的interface看起来非常相似,从开发者角度来看,都可以实现具体类型的抽象化。 golang: Rust: 从上面的代码可以简单看...
为了确保安全性,Rust在零抽象的基础上,限制了很多易导致潜在bug的操作,比如直接指针操作,以及长生命周期等等,但是在某些情况下,如果涉及到操作比较底层的数据,往往难免自行...
在Rust中,当一个变量生命周期终结时,会自动进行变量回收,一般情况下,这个回收过程是自动完成的,比如一个新建的struct会被自动释放内存,但是在某些情况下,需要自定义dr...
实现二叉树是学习一门编程语言过程中必不可少的一项训练内容,但是对于Rust而言,难度系数要远超常规语言。 我们首先以C语言的风格来定义二叉树的节点: 由于 Rust 中要求变...
概念 Sized是Rust编译阶段检查对象操作的一个基本依据,Rust只允许操作已知大小的对象, 未知大小的对象只能操作它的指针(&)。 默认情况下,任何类型参数都是Size...
trait中的范型 在定义trait时,可以使用范型: Dagongren是一个trait,包含了banzhuan(&self) -> T方法,凡是实现了该方法的结构体,均可...
简介 C/C++、Rust都属于强类型语言,在定义变量或者是传参时,必须明确指定数据的数据类型。明确指定类型对于程序员,或者是编译器来讲,可以使得阅读代码更加清晰,但是很多时...
智能指针 在C/C++中,堆内存的申请和释放都由程序员自己管理,自C++11起,引入了智能指针来协助管理内存。对于编译器来说,智能指针实际上是一个栈对象,并非指针类型,在栈对...
在前文中我们分析了使用lazy_static来构造全局变量,典型用法如下: once_cell 提供了 unsync::OnceCell 和 sync::OnceCell 这...
问题背景 在并发编程场景下,消息传递是一个最基本的操作,例如,在Golang中,可以简单的通过chan来传递,而在Rust中,也提供了类似的channel机制用于线程间的消息...
Memory model 在各类偏系统方向的面试宝典中,一个常见的知识点就是对于volatile关键词的理解。照本宣科的回答通常是说,加了这个关键词,会禁用编译器对这个变量的...
在实际项目开发中,难免需要用到全局变量,比如全局配置信息,全局内存池等,此类数据结构可能在多处需要被使用,保存为全局变量可以很方便的进行修改与读取。 在Rust中,如果只是读...
问题背景 来看一个简单的结构体定义: 在结构体B中包含了一个结构体A,如果需要在A的foo函数中对A中的变量进行修改,则A中的foo函数需要修改参数为&mut self,此时...