Linux下nvidia-smi报错
1. Failed to initialize NVML: driver/library version mismatch
问题:服务器更新 N 卡驱动版本之后,内核中的 N 卡驱动模块没有更新。
解决:有两种方式解决
重启服务器。
让内核重新载入 N 卡驱动模块:
12sudo rmmod nvidianvidia-smi
2. NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
问题:N 卡驱动模块没有成功加载到内核,可能是由于 Linux 内核升级导致版本不兼容。
解决:
检查是否安装了 dkms(dkms 是一个非常方便的内核模块管理工具),如果没有安装需要手动安装一下。
利用 dkms 检测 N 卡驱动模块在 Linux 内核升级时是否有成功编译加载:
1dkms status
若显示 N 卡驱动模块没有成功编译加载,则可以利 ...
图像矩概述
1. 概述
矩函数在图像分析中有着广泛的应用,如模式识别、目标分类、目标识别与方位估计、图像编码和重构等。一个从一幅数字图像中计算出来的矩集,通常描述了该图像形状的全局特征,并提供大量的关于该图像不同类型的几何特性信息。
一个概率密度函数的零阶、一阶、二阶矩分别表示其全概率、数学期望和方差。
零阶到三阶矩用于描述总体水平上的图像特征,而更高阶矩则含有更好的图像细节,但通常对噪声更加敏感,可以变换方式减少或消除噪声的影响。
2. 定义
2.1 XY 坐标
将一幅图像看成一个二维密度分布 f(x,y)f(x,y)f(x,y),函数值 f(x,y)f(x,y)f(x,y) 表示点 (x,y)(x,y)(x,y) 处图像像素的亮度值;用 ζ\zetaζ 表示 x−yx-yx−y 平面上图像的区域,即 f(x,y)f(x,y)f(x,y) 的定义域范围。设一幅图像的亮度函数为 f(x,y)f(x,y)f(x,y),它的 (p+q)(p+q)(p+q) 阶矩函数的一般定义如下:
\begin{aligned}
\Phi_{pq} = \iint\limits_\zeta \Psi_{pq}(x ...
Rust常见集合
1. 简介
Rust 标准库中包含一系列被称为「集合」(collections)的非常有用的数据结构。不同于内建的数组和元组类型,这些集合指向的数据是储存在堆上的,这意味着数据的数量不必在编译时就已知,并且还可以随着程序的运行增长或缩小。
2. 向量(vector)
vector 的数据类型为Vec<T>,它允许我们在一个单独的数据结构中储存多于一个的值,它在内存中彼此相邻地排列所有的值。
vector 只能储存相同类型的值。
2.1 创建向量
创建一个新向量的基本语法示例如下:
12345// 方式一:新建一个空的向量let v: Vec<i32> = Vec::new();// 方式二:使用初始值来新建向量// vec! 为 Rust 提供的一个宏let v = vec![1, 2, 3];
【注】在向量的结尾增加新元素时,在没有足够空间将所有所有元素依次相邻存放的情况下,可能会要求分配新内存并将老的元素拷贝到新的空间中。
2.2 更新向量
向一个向量末尾追加元素,可以使用 push 方法:
12345let mut v = Vec::new();/ ...
Rust模块系统
1. 简介
Rust 的模块系统用来管理代码的组织,包括哪些内容可以被公开,哪些内容作为私有部分,以及程序每个作用域中的名字等。模块系统包括:
包(Packages):Cargo 的一个功能,允许构建、测试和分享 crate。
crate:一个模块的树形结构,它形成了库或二进制项目。
模块(Modules)和 use: 允许你控制作用域和路径的私有性。
路径(path):一个命名例如结构体、函数或模块等项的方式。
2. 包和 crate
2.1 crate
crate 是一个二进制项或者库。crate root 是一个源文件,Rust 编译器以它为起始点,并构成你的 crate 的根模块。
一个 crate 会将一个作用域内的相关功能分组到一起,使得该功能可以很方便地在多个项目之间共享。
2.2 包
包(package) 是提供一系列功能的一个或者多个 crate。一个包会包含有一个 Cargo.toml 文件,阐述如何去构建这些 crate。
一个包中至多只能包含一个库 crate(library crate)。
包中可以包含任意多个二进制 crate(binary cra ...
Rust方法和关联函数
1. 方法
1.1 简介
方法与函数类似:它们使用 fn 关键字和名称声明,可以拥有参数和返回值,同时包含在某处调用该方法时会执行的代码。
不过方法与函数是不同的,方法是在结构体(或者枚举、trait 对象)的上下文中被定义的。
为了使方法位于指定结构体的上下文中,需要将方法放置在该结构体的 impl 块中。
方法的第一个参数总是 self,它代表调用该方法的结构体实例。
1.2 格式
定义一个结构体的方法示例如下:
12345678910struct Rectangle { width: u32, height: u32,}// 定义 Rectangle 的方法impl Rectangle { fn area(&self) -> u32 { self.width * self.height }}
2. 关联函数
2.1 简介
关联函数与结构体相关联,同样在 impl 块中定义。它和方法的不同在于它不以 self 作为参数,因此它不是一个结构体的实例。
关联函数经常被用 ...
Rust所有权
1. 简介
所有运行的程序都必须管理其使用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时不断地寻找不再使用的内存;在另一些语言中,程序员必须亲自分配和释放内存。Rust 则选择了第三种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。在运行时,所有权系统的任何功能都不会减慢程序。
2. 所有权规则
Rust 中每一个值都有一个被称为「所有者」的变量。
值在任一时刻有且只有一个所有者。
当所有者离开作用域,这个值将被丢弃(内存回收)。
2.1 作用域
变量的作用域是其在程序中有效的范围,一个变量作用域从声明的地方开始一直持续到最后一次使用为止,且其作用域被限制在变量声明所处的最内层 {} 代码块中,即最大不能超出其所处的最内层 {} 区域。
2.2 垃圾回收
在有垃圾回收(garbage collector,GC)的语言中, GC 记录并清除不再使用的内存,而我们并不需要关心它。
在没有 GC 的语言中,需要手动识别出不再使用的内存并调用代码显式释放,跟请求内存的时候一样。
Rust 采取了一个不同的策略: ...
Rust控制流
1. 条件结构
Rust 中主要的条件结构为 if 表达式。
1.1 if 表达式
if 表达式的基本语法格式如下:
123456789if <condition1> { ...} else if <condition2> { ...} else if <conditionn> { ...} else { ...}
其中,else if 和 else 分支都是可选的。表达式中的条件 conditionX 必须是 bool 类型的。
由于是表达式,因此可以将 if 表达式的值赋值给变量。
由于 Rust 是静态编译语言,要求在编译时就确定所有变量的类型,因此 if 表达式的每个分支可能的返回值都必须相同。
123456let condition = true;let branch = if condition { 1} else { 2}
2. 循环结构
Rust 中提供的循环结构有 loop、while 和 for。Rust 提 ...
Rust错误处理
1. 简介
在很多情况下,Rust 要求你承认出错的可能性,并在编译代码之前就采取行动。这些要求使得程序更为健壮,它们确保了你会在将代码部署到生产环境之前就发现错误并正确地处理它们!Rust 将错误组合成两个主要类别:「可恢复错误」(recoverable)和「不可恢复错误」(unrecoverable)。
可恢复错误通常代表向用户报告错误和重试操作是合理的情况,比如未找到文件。
不可恢复错误通常是 bug 的同义词,比如尝试访问超过数组结尾的位置。
大部分语言并不区分这两类错误,并采用类似异常这样方式统一处理他们。Rust 并没有异常,但是有可恢复错误 Result<T, E> 和不可恢复(遇到错误时停止程序执行)错误 panic!。
panic! 宏代表一个程序无法处理的状态,并停止执行而不是使用无效或不正确的值继续处理。
Result 枚举代表操作可能会在一种可以恢复的情况下失败。可以使用 Result 来告诉代码调用者他需要处理潜在的成功或失败。在
适当的场景使用 panic! 和 Result 将会使代码在面对不可避免的错误时显得更加可靠。
2. pani ...
代码风格规范
1. 简介
各种编程语言层出不穷,各种语言的代码风格规范也不尽相同。主流的代码风格规范有:camel case、snake case、kebab case。
2. 代码风格
2.1 camel case(驼峰式)
camel case 式命名的名称中,单词之间直接相连,除了第一个单词外后面单词首字母均大写。
如果第一个单词首字母大写,则称为 CamelCase(大驼峰式)。
如果第一个单词首字母小写,则称为 camelCase(小驼峰式)。
2.2 snake case(蛇式)
snake case 式命名的名称中,使用 _ 来分隔相邻单词。
如果所有单词都小写,称为 lower_snake_case(小蛇式)。
如果所有单词都大写,称为 UPPER_SNAKE_CASE(大蛇式)。
2.3 kebab case(烤肉串式)
kebab case 式命名的名称中,使用 - 来分隔相邻单词,所有单词都小写。
附录
参考资料来源于:
Letter case
Camel case
Snake case
Rust函数
1. 格式
Rust 代码中函数定义的基本语法格式如下:
1234fn <function>(<parameters>) { // 函数体 ...}
其中,fn 为函数声明关键字,<function> 为函数名,<parameters> 为参数列表,{} 用于指定函数体的开始和结束。和大多数编程语言一样,Rust 中 main 函数也是程序的入口点。
2. 参数
Rust 函数可以定义输入参数列表 <parameters>。在 <parameters> 中,必须声明每个参数的类型,多个参数用 , 分隔。
1234fn example(x: i32, y: i32) { println!("The value of x is: {}", x); println!("The value of y is: {}", y);}
3. 函数体
函数体由一系列的语句和一个可选的结尾表 ...
Rust基本数据类型
1. 简介
在 Rust 中,每个值都属于某一个数据类型,用来告诉 Rust 它被指定为何种数据,以便明确数据处理方式。Rust 基本数据类型主要有两类子集:标量(scalar)和复合(compound)。
此文所讲的基本数据类型都是 Rust 原生的数据类型,它们都是创建在「栈」上的数据结构。
Rust 标准库还提供了一些更复杂的数据类型,它们有些是创建在「堆」上的数据结构,比如下文提到的 vector 数据类型。
【注】Rust 是静态类型语言,因此在编译时就必须知道所有变量的类型。通常,根据值及其使用方式,Rust 编译器可以推断出我们想要用的类型;当多种类型均有可能时,必须增加类型注解,否则编译会报错。
2. 标量类型
标量(scalar)类型代表一个单独的值。Rust 有四种基本的标量类型:整型、浮点型、布尔类型和字符类型。
2.1 整型
Rust 内建的整数类型如下表所示:
长度
有符号
无符号
8-bit
i8
u8
16-bit
i16
u16
32-bit
i32
u32
64-bit
i64
u64
128-bit
i128
u12 ...
Rust常量与变量
1. 常量
声明常量使用的关键字是 const。
在声明常量时,必须注明值的类型。
常量可以在任何作用域中声明,包括全局作用域。常量在它的作用域中,整个程序生命周期中都有效。
常量只能被设置为常量表达式,而不能是函数调用的结果,或其他任何只能在运行时计算出的值。
将遍布于应用程序中的硬编码值声明为常量,能帮助后来的代码维护人员了解值的意图。如果将来需要修改硬编码值,也只需修改汇聚于一处的硬编码值。
1const MAX_POINTS: u32 = 100_000;
2. 变量
Rust 中的变量是默认不可变的(immutable),这是推动我们充分利用 Rust 提供的安全性和简单并发性来编写代码的众多方式之一。不过我们仍然可以使用可变变量。声明变量使用的关键字是 let 。
2.1 不变变量
当变量不可变时,一旦值被绑定一个名称上,就不能改变这个值。定义变量的基本语法如下:
1let var = <value>;
这种方式定义的变量默认是不可变的。
2.2 可变变量
定义的变量只是默认不可变,我们可以在变量名加上 mut 来使其可变:
1let mut var = & ...