一文学习Git基础命令
Git基础命令安装 在Linux上安装 1sudo apt-get install git 在Windows上安装:下载git程序 安装完设置,在命令行输入 12git config --global user.name "Your Name"git config --global user.email "[email protected]" 创建版本库创建空目录123mkdir learngitcd learngitpwd 将目录变成git仓库1git init 把文件添加到版本库1234567#1.创建并编写文件touch 文件名vim 文件名#2.暂存文件,将文件放入暂存区。git add 文件名#3.提交更新,找到暂存区的文件,存储到Git仓库。git commit -m "本次提交的说明" 版本回退查看当前版本状态 要随时掌握工作区的状态,使用git status命令。 如果git status告诉你有文件被修改过,用git diff可以查看修改内容。 版本回退 git...
Linux基础命令
Linux基础命令ls命令功能:列出文件夹信息语法:ls [-l -h -a] [参数] 参数:被查看的文件夹,不提供参数,表示查看当前工作目录 -l,以列表形式查看 -h,配合-l,以更加人性化的方式显示文件大小 -a,显示隐藏文件 pwd命令功能:展示当前工作目录语法:pwd cd命令功能:切换工作目录语法:cd...
C++的ACM模式输出入
C++常用的输入方法在C++语言中,标准输入操作需要包含头文件 <iostream>。 1. cincin可以连续从键盘读取多个数据,直到遇到分隔符(空格、Tab键和换行符)为止。 2. getline()当我们需要读取包含空格的字符串时,cin读不全整个字符串。此时,可以使用getline()函数来解决问题。 使用getline()函数时,需要包含头文件<string>。getline()函数会读取整行内容,包括空格字符,直到遇到换行符为止。 函数原型:getline(istream& is, string& str, char delim);(1)is是输入流,这里是 cin,表示从标准输入流中读取数据。(2)str是存储读取结果的字符串。(3)delim是分隔符,即当读取到这个字符时,getline函数停止读取。 getline(cin,s);没有提供第三个参数(分隔符),以此该句的作用是从标准输入中读取一行文本,将其存储在字符串...
Python的ACM模式输出入
输入1. 单行输入多个整数12nums = list(map(int, input().split()))print(sum(nums)) 2.多行输入(行数n未知)12345678910111213# 方法1while True: try: nums = list(map(int, input().split())) print(sum(nums)) except EOFError: break# 方法2import sysfor line in sys.stdin: nums = list(map(int, line.split())) print(sum(nums)) 3.多行输入(行数n已知)1234t = int(input())for _ in range(t): nums = list(map(int, input().split())) print(sum(nums)) 4. 多个测试用例,每个测试用例包含多行数据123456t = int(input())for _ in...
常用设计模式讲解
单例设计模式 ⭐定义单例模式是一种创建型设计模式,它的核心思想是保证一个类只有一个实例,并提供一个全局访问点来访问这个实例。 优点1.全局控制:保证只有一个实例,这样就可以严格的控制客户怎样访问它以及何时访问它,简单的说就是对唯一实例的受控访问。2. 节省资源:也正是因为只有一个实例存在,就避免多次创建了相同的对象,从而节省了系统资源,而且多个模块还可以通过单例实例共享数据。3. 懒加载:单例模式可以实现懒加载,只有在需要时才进行实例化,这无疑会提高程序的性能。 基本要求(规则) 私有的构造函数:防止外部代码直接创建类的实例。 私有的静态实例变量:保存该类的唯一实例。 公有的静态方法:通过公有的静态方法来获取类的实例。 种类饿汉模式不管是否需要使用这个实例,直接先创建好实例,然后当需要使用的时候,直接调方法就可以使用了。 1234567891011121314151617class Singleton{private: // 静态成员变量在类加载时初始化 static Singleton instance;private: Singleton() =...
常见手撕算子——一维数组的softmax
SoftMax Softmax 的 CPU 和 CUDA 写法均是高频考察。面试时有可能会让任选一种写法进行书写,此时自己可以先写 CPU(C++、Python) 版本,然后再写 CUDA 版本。 Softmax公式如下: $$softmax(x_i) = \frac{e^{x_i}}{\sum_j e^{x_j}}$$ 一般为了避免溢出,需要减去最大值,所以通常采用下面这个公式: $$softmax(x_i) = \frac{e^{x_i - max(x)}}{\sum_j e^{x_j - max(x)}}$$ 1. CPU(C++、Python) 版本1234567891011void softmax(float* input, float* output, int N){ float max_value = *std::max_element(input, input + N); float sum = 0; for(int i = 0; i < N; i++){ output[i] =...
常见手撕算子-elementwise
elementwise elementwise 是最简单的一类算子,其指的是对数据进行逐元素操作,例如将两个等长的数组对应元素相加(add)。另外在深度学习中,激活函数会对输入数据的每个元素求对应激活值,故激活函数也算在 elementwise 范围内。 add1234567891011121314151617181920212223242526272829303132333435363738394041// 1. 向上取整#define CEIL(a, b) ((a + b - 1) / (b))// 2. FLOAT4,用于向量化访存,以下两种都可以// c写法#define FLOAT4(value) *(float4*)(&(value))// c++写法#define FLOAT4(value) (reinterpret_cast<float4*>(&(value))[0])//naive版int block_size = 1024;int grid_size = CEIL(N,...
常见手撕算子——sgemm(单精度矩阵乘法)
1. cpu: 矩阵乘法1234567891011121314151617181920212223242526272829// 二维矩阵void matrixMultiply(const float** A, const float** B, float** C, int m, int p, int n) { // A is m x p, B is p x n, C is m x n for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { float sum = 0.0; for (int k = 0; k < p; ++k) { sum += A[i][k] * B[k][j]; } C[i][j] = sum; } }}// 二维矩阵展开成一维void...
常见手撕算子-reduce
Reduce 算子是指通过对数组中的每个元素进行操作,得到一个输出值的过程。常见的操作包括求和(sum)、取最大值(max)、取最小值(min)等。在 CUDA 中,优化 Reduce 算子可以显著提高计算效率。 1. naive实现1234567//累加__global__ void reduce1(float* d_in, float* d_out, int N) { int idx = blockIdx.x * blockDim.x + threadIdx.x; if (idx < N) { atomicAdd(d_out, d_in[idx]); }} 2. share mem + 折半规约12345678910111213141516171819202122232425262728__global__ void reduce2(float* d_in, float* d_out, int N) { __shared__ float sdata[BLOCK_SIZE]; ...
常见手撕算子——transformer的softmax_matrix
1.cpu: 计算每行的softmax12345678910111213141516void softmax_row(float* input, float* output, int M, int N) { for (int row = 0; row < M; row++) { // 第row行 float* input_tmp = input + row * N; float* output_tmp = output + row * N; float max_val = *(std::max_element(input_tmp, input_tmp + N)); // 计算输入数组的最大值 float sum = 0; for (int i = 0; i < N; i++) { output_tmp[i] = std::exp(input_tmp[i] - max_val); //...










