手把手教你在昇腾平台上搭建PyTorch训练环境

摘要:在昇腾平台上运行PyTorch业务时,需要搭建异构计算架构CANN软件开发环境,并安装PyTorch 框架,从而实现训练脚本的迁移、开发和调试。

本文分享自华为云社区《手把手教你在昇腾平台上搭建PyTorch训练环境》,作者:昇腾CANN。

PyTorch是业界流行的深度学习框架,用于开发深度学习训练脚本,默认运行在CPU/GPU上。在昇腾AI处理器上运行PyTorch业务时,需要搭建异构计算架构CANN(Compute Architecture for Neural Networks)软件开发环境,并安装PyTorch 框架,从而实现训练脚本的迁移、开发和调试。

下面带大家了解如何在昇腾平台上快速安装驱动固件、CANN软件及PyTorch框架。

环境检查

在昇腾平台上安装驱动和固件前,首先需要检查安装环境的NPU是否正常在位,并确认操作系统版本与内核版本是否满足对应的版本配套要求。

以Atlas 800 训练服务器(型号:9010)(昇腾AI处理器型号Ascend 910)为例,检查NPU是否正常在位可执行lspci | grep d801命令,如果服务器上有 N路NPU,回显N行含“d801”字段,则表示NPU正常在位。

安装驱动和固件

1.创建驱动运行用户HwHiAiUser。

groupadd -g 1000 HwHiAiUser 
useradd -g HwHiAiUser -u 1000 -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash

2.安装驱动和固件。

在昇腾社区的“固件与驱动”下载页面下载配套产品的固件驱动软件,并上传到服务器任意目录,然后参考如下命令进行固件驱动软件包的安装,需要注意,需要以root用户进行安装。

a.为软件包增加可执行权限。

chmod +x Ascend-hdk-910-npu-driver_23.0.rc1_linux-x86-64.run
chmod +x Ascend-hdk-910-npu-firmware_6.3.0.1.241.run

b.安装驱动。

./Ascend-hdk-910-npu-driver_23.0.rc1_linux-x86-64.run --full --install-for-all

默认安装路径为“/usr/local/Ascend”,出现类似如下回显信息,说明安装成功。

Driver package installed successfully!复制

您还可以通过执行npu-smi info命令查看,出现类似如下信息,说明驱动加载成功。

c.安装固件。

./Ascend-hdk-910-npu-firmware_6.3.0.1.241.run --full

出现类型如下回显信息,说明安装成功。

Firmware package installed successfully! Reboot now or after driver installation for the installation/upgrade to take effect

3.驱动固件安装完成后,重启系统。

reboot

安装CANN软件依赖

CANN软件安装过程需要下载相关依赖,请确保安装环境能够连接网络,并已配置软件源,以下步骤以root用户操作为例。

1. 安装第三方依赖

Ubuntu系统(Debian、UOS20、Linux等系统操作一致):

apt-get install -y gcc g++ make cmake zlib1g zlib1g-dev openssl libsqlite3-dev libssl-dev libffi-dev unzip pciutils net-tools libblas-dev gfortran libblas3

openEuler系统(EulerOS、CentOS、BCLinux等系统操作一致):

yum install -y gcc gcc-c++ make cmake unzip zlib-devel libffi-devel openssl-devel pciutils net-tools sqlite-devel lapack-devel gcc-gfortran

2. 安装Python及其依赖

以安装Python 3.7.5为例。

1)通过wget命令下载python3.7.5源码包。

wget http://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz

2)解压缩源码包

tar -zxvf Python-3.7.5.tgz

3)源码编译安装Python。

​cd Python-3.7.5
./configure --prefix=/usr/local/python3.7.5 --enable-loadable-sqlite-extensions --enable-shared
make
make install

以--prefix=/usr/local/python3.7.5路径为例进行说明。执行配置、编译和安装命令后,安装包在/usr/local/python3.7.5路径。

4)设置python3.7.5环境变量。

#用于设置python3.7.5库文件路径
export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH
#如果用户环境存在多个python3版本,则指定使用python3.7.5版本
export PATH=/usr/local/python3.7.5/bin:$PATH

5)检查是否安装成功。

​python3 --version
pip3 --version

返回相关版本信息,则说明安装成功。

6)安装pip依赖。

pip3 install attrs numpy decorator sympy cffi pyyaml pathlib2 psutil protobuf scipy requests absl-py

安装CANN开发套件包

1. 从昇腾社区“CANN”产品页,根据操作系统架构下载CANN开发套件包。

例如“Ascend-cann-toolkit_6.3.RC1_linux-x86_64.run”,并将其上传到安装环境任意目录。

2. 安装CANN开发套件包。

# 添加可执行权限
chmod +x Ascend-cann-toolkit_6.3.RC1_linux-x86_64.run
# 校验软件包的一致性和完整性
./Ascend-cann-toolkit_6.3.RC1_linux-x86_64.run --check
# 执行安装命令
./Ascend-cann-toolkit_6.3.RC1_linux-x86_64.run --install --install-for-all

安装完成后,若显示如下信息,则说明软件安装成功:

[INFO] xxx install success

xxx表示安装的实际软件包名。

安装PyTorch

CANN软件包安装完成后,就可以进行PyTorch的安装了。开发者可以选择PyTorch 1.8.1或PyTorch 1.11.0版本,PyTorch安装成功后再安装APEX混合精度模块。在安装Pytorch前,需要先安装以下依赖。

pip3 install wheel
pip3 install typing_extensions

安装PyTorch 1.8.1

1)安装官方torch包。

x86_64架构

wget http://download.pytorch.org/whl/cpu/torch-1.8.1%2Bcpu-cp37-cp37m-linux_x86_64.whl
pip3 install torch-1.8.1+cpu-cp37-cp37m-linux_x86_64.whl

aarch64架构

wget http://repo.huaweicloud.com/kunpeng/archive/Ascend/PyTorch/torch-1.8.1-cp37-cp37m-linux_aarch64.whl
pip3 install torch-1.8.1-cp37-cp37m-linux_aarch64.whl

2)安装昇腾提供的PyTorch适配插件torch_npu。

x86_64架构

wget http://gitee.com/ascend/pytorch/releases/download/v5.0.rc1-pytorch1.8.1/torch_npu-1.8.1.post1-cp37-cp37m-linux_ x86_64.whl
pip3 install torch_npu-1.8.1.post1-cp37-cp37m-linux_ x86_64.whl

aarch64架构

​wget http://gitee.com/ascend/pytorch/releases/download/v5.0.rc1-pytorch1.8.1/torch_npu-1.8.1.post1-cp37-cp37m-linux_aarch64.whl
pip3 install torch_npu-1.8.1.post1-cp37-cp37m-linux_aarch64.whl

此处以5.0.rc1版本为例,实际请选择CANN配套的PyTorch插件版本进行安装。

3)安装对应框架版本的torchvision。

pip3 install torchvision==0.9.1

4)验证是否安装成功。

python -c "import torch;import torch_npu; a = torch.ones(3, 4).npu(); print(a + a);"

如果输出包含如下关键信息则说明PyTorch安装成功。

[[2., 2., 2., 2.],
  [2., 2., 2., 2.],
  [2., 2., 2., 2.]]

安装PyTorch 1.11.0

1)安装官方torch包。

x86_64架构

wget http://download.pytorch.org/whl/cpu/torch-1.11.0%2Bcpu-cp37-cp37m-linux_x86_64.whl
pip3 install torch-1.11.0+cpu-cp37-cp37m-linux_x86_64.whl

aarch64架构

wget http://repo.huaweicloud.com/kunpeng/archive/Ascend/PyTorch/torch-1.11.0-cp37-cp37m-linux_aarch64.whl
pip3 install torch-1.11.0-cp37-cp37m-linux_aarch64.whl

2)安装昇腾提供的PyTorch适配插件torch_npu。

x86_64架构

wget http://gitee.com/ascend/pytorch/releases/download/v5.0.rc1-pytorch1.11.0/torch_npu-1.11.0-cp37-cp37m-linux_ x86_64.whl
pip3 install torch_npu-1.11.0-cp37-cp37m-linux_ x86_64.whl

aarch64架构

wget http://gitee.com/ascend/pytorch/releases/download/v5.0.rc1-pytorch1.11.0/torch_npu-1.11.0-cp37-cp37m-linux_aarch64.whl
pip3 install torch_npu-1.11.0-cp37-cp37m-linux_aarch64.whl

3)安装对应框架版本的torchvision。

pip3 install torchvision==0.12.0

4)验证PyTorch是否安装成功。

python -c "import torch;import torch_npu; a = torch.ones(3, 4).npu(); print(a + a);"

如果输出包含如下关键信息则说明PyTorch安装成功。

[[2., 2., 2., 2.],
  [2., 2., 2., 2.],
  [2., 2., 2., 2.]]

安装APEX混合精度模块

APEX混合精度模块是一个集优化性能、精度收敛于一身的综合优化库,可以提供不同场景下的混合精度训练支持。

1. 获取昇腾适配的APEX源码以及原生APEX代码。

# 获取昇腾适配的APEX源码
git clone -b master http://gitee.com/ascend/apex.git
# 在apex目录下获取原生APEX代码
cd apex
git clone http://github.com/NVIDIA/apex.git

2. 切换到原生APEX代码对应分支。

cd apex
git checkout 4ef930c1c884fdca5f472ab2ce7cb9b505d26c1a
cd ..

3. 在昇腾适配APEX源码目录的scripts路径下生成昇腾适配全量代码。

cd scripts
bash gen.sh

4. 编译生成昇腾适配的APEX二进制安装包。

cd ../apex
python3 setup.py --cpp_ext --npu_float_status bdist_wheel

5. 安装APEX。

86_64架构

cd dist
pip3 install apex-0.1_ascend-cp37-cp37m-linux_ x86_64.whl

aarch64架构

cd dist
pip3 install apex-0.1_ascend-cp37-cp37m-linux_aarch64.whl

到此,PyTorch训练环境就搭建完毕了,开发者可以将PyTorch网络脚本迁移到昇腾平台执行训练,使用昇腾平台的强大算力。

关于更多文档介绍,可以在昇腾文档中心[1]查看,您也可在“昇腾社区在线课程[2]”板块学习视频课程,学习过程中的任何疑问,都可以在“昇腾论坛[3]”互动交流!

相关参考

[1]昇腾文档中心

[2]昇腾社区在线课程

[3]昇腾论坛

 

点击关注,第一时间了解华为云新鲜技术~

本文转载于网络 如有侵权请联系删除

相关文章

  • 常用vbs代码[通俗易懂]

    大家好,又见面了,我是你们的朋友全栈君。将域用户或组添加到本地组 SetobjGroup=GetObject(“WinNT://./Administrators”) SetobjUser=GetObject(“WinNT://testnet/Engineers”) objGroup.Add(objUser.ADsPath)修改本地管理员密码 Setobjcnlar=GetObject(“WinNT://./administrator,user”) objcnla.SetPassword“P@ssW0rd” objcnla.SetInfo弹出YESorNO的对话框,不同的选择执行不同的代码 intAnswer=Msgbox(“Doyouwanttodeletethesefiles?”,vbYesNo,“DeleteFiles”) IfintAnswer=vbYesThen Msgbox“Youansweredyes.” ElseMsgbox“Youansweredno.” EndIf运行CMD命令行命令 setobshell=wscript.createobjec

  • android-活动最佳实践

    知晓当前在哪个活动创建一个BaseActivity类继承Activity 在onCreate中输出类名publicclassBaseActivityextendsAppCompatActivity{ privatestaticfinalStringTAG="BaseActivity"; @Override publicvoidonCreate(BundlesavedInstanceState,PersistableBundlepersistentState){ super.onCreate(savedInstanceState,persistentState); Log.d(TAG,getClass().getSimpleName()); } }复制随时随地退出程序新建一个ActivityCollector作为活动管理器publicclassActivityCollector{ publicstaticList<Activity>activities=newArrayList<>(); publicstaticvoidaddActiv

  • 量化交易数据获取:tushare基本介绍和基本操作

    TOC基本介绍官网:https://waditu.com/SwVUbXt5eRv2FMJskaVu1BHyt8XKjp平台介绍沪深股票数据是Tushare最传统最有历史的数据服务项目,从一开始就为广大的投资者,尤其是量化投资者提供了稳定、便捷的接口。TusharePro版在继承了旧版API的便捷易用性的同时又加强了数据的广度和深度。最为关键的是,数据来源和采集方式也发生了根本的变化,除了公开渠道的数据源,最关键性的变化是Tushare构建起来了自有的数据存储和数据治理体系,同时依托平台化的维护和管理方式,让数据更稳定可靠,而且服务能力也能得到质的的变化。基本操作安装:pipinstalltushare--upgradeimporttushareasts ts.set_token('tokens') pro=ts.pro_api() #查询当前所有正常上市交易的股票列表 data=pro.stock_basic(exchange='',list_status='L',fields='ts_code,symbol,

  • Android Jetpack系列 之分页库Paging3(一)

    前言许久没有更新Jetpack系列的文章了,本篇文章为大家分享分页库Paging3的使用,如果你还没有看过我Jetpack其他的文章,可以移步至链接:AndroidJetPack系列文章,持续更新中为了能让自己更加快速的学习,英语菜鸡的我最近一直在恶补英语,直接看原版官方文档学习的会更快,皇天不负有心人,经过两个星期的坚持,现在官方文档上的10个单词我已经认识两个了~Paging是什么想想我们之前的业务中,实现分页加载需要怎么处理?一般我们都是自己封装RecycleView或者使用XRecycleView这种第三方库去做,而Paging就是Google为我们提供的分页功能的标准库,这样我们就无须自己去基于RecycleView实现分页功能,并且Paging为我们提供了许多可配置选项,使得分页功能更加灵活。而Paging3是Paging库当前的最新版本,仍处于测试版本,相比较于Paging2的使用就简洁多了。Paging的使用项目搭建首先我们新建项目,在gradle中引用paging库如下:defpaging_version="3.0.0-alpha07" imple

  • Android进阶:Binder那么弱怎么面大厂?

    Binder机制在Android中的地位举足轻重,是用于通信的机制,我们需要掌握的很多原理都和Binder有关。其中系统服务的获取过程也与Binder有关。获取系统服务前需要了解ServiceManager的启动过程,这样更有助于理解系统服务的注册过程和获取过程。本文选自《Android进阶指北》一书,将主要介绍ServiceManager的启动过程。▼扫码获取本书详情▼如果想要了解ServiceManager的启动过程,就需要查看KernelBinder部分的源码。这部分代码在内核源码中,AOSP源码是不包括内核源码的,因此需要单独下载。ServiceManager是init进程负责启动的,具体是在解析init.rc配置文件时启动的,而init进程是在系统启动时启动的,因此ServiceManager亦是如此(不理解init进程和init.rc配置文件的同学可以看看《Android进阶解密》第2章内容)。rc文件内部由Android初始化语言编写(AndroidInitLanguage)的脚本,主要包含5种类型的语句:Action、Commands、Services、Options和

  • 基于Haproxy的高可用实战

    Haproxy介绍 软件:haproxy---主要是做负载均衡的7层,也可以做4层负载均衡apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用。负载均衡是通过OSI协议对应的7层负载均衡:用的7层http协议,4层负载均衡:用的是tcp协议加端口号做的负载均衡ha-proxy概述ha-proxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。ha-proxy的特点ha-proxy作为目前流行的负载均衡软件,必须有其出色的一面。下面介绍一下ha-proxy相对LVS,Nginx等负载均衡软件的优点。•支持tcp/http两种协议层的负载均衡,使得其负载均衡功能非常丰富。•支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。•性能非常优秀,基于单进程处理模式(和Nginx类似)让其性能卓越。•拥有一个功能出色的监控页面,实时了解系统的当前状况。•功能强大的ACL支持,给用户极大的方便。haproxy算法:1.roundrobin基于权重进行轮询,在服务器的处理时间保

  • python文字转图片(二值、RGB)以及numpy数组

    文字一般使用unicode等编码的形式在计算机中表示,但是其形态本身也很有价值。如果能够把文字转为图片,就可以做一些应用,比如:基于最近邻查找来实现简单的OCR文字识别从像素中提取特征用于机器学习,如Glyce其他的各种脑洞,比如计算字符所占像素数/长/宽之类的其实现的思路不是那么直截了当,但是想通了就不困难了,就是在画布上画一个字。说到画图,肯定要想到python中的PIL/Pillow库了。代码实现如下:fromPILimportImage,ImageDraw,ImageFont importnumpyasnp importmatplotlib.pyplotasplt if__name__=="__main__": #预设合适的字体,对于中文尤其重要,否则会乱码,这里使用常见的黑体 fontsize=16 font=ImageFont.truetype("simhei",fontsize,encoding='utf-8') #灰度图 image=Image.new('1',(fontsize,font

  • JqGrid 合计的2个坑

    作为全栈程序员,入坑爬坑基本已经是常事了。梦想的距离和实际的距离永远是有距离的。今天花了一个下午处理一个JqGrid的表格合计的事情,爬了2个坑;分享给大家吧。当然应该有更好的方法避免,但由于时间和精力所以解决了就不去再分析了。坑一:jqGrid的分页记录总数(缺少最后一页):jqGrid分页记录总数varrows=$("#orders").jqGrid("getRowData")最后一行总是获取不到。那合计和数据就会出问题,于是只好手动进行处理。varjsonDataOrderList1=$("#gridList").jqGrid('getRowData'),total_count=0; varallCountID=$("#gridList").jqGrid('getDataIDs');//获取所有行的rowid jsonDataOrderList1.push($("#gridList").jqGrid('getRowData'

  • 在CentOS 7上安装MongoDB

    在这个MongoDB教程中,我们将解释如何在CentOS7上安装数据库,然后提供一些基本特性和功能的简短指南。MongoDB是一个非关系型数据库引擎,面向文档的数据库的访问。它是不断增长的NoSQL运动的一部分,其中还有Redis和Cassandra等非关系型数据库(尽管许多非关系型数据库之间存在巨大差异)。MongoDB旨在提供传统关系数据库管理系统(RDBMS)的替代方案。除了灵活数据模型设计和可扩展架构外,MongoDB还提供JSON输出和专用的,特定于语言的绑定,使其特别适用于自定义应用程序开发和快速原型设计。MongoDB已经在许多大规模生产部署中使用,并且目前是所有系统中最流行的数据库引擎之一。由于MongoDB运行可能需要大量内存空间,因此我们建议在本指南中使用拥有高内存的Linode。在你开始之前熟悉我们的入门指南并完成设置Linode主机名和时区的步骤。完成“保护您的服务器”这个部分来创建标准用户帐户,同时加强SSH访问并删除不必要的网络服务。更新你的系统:sudoyumupdate复制注意 本指南是为非root用户编写的。需要提升权限的命令带有前缀sudo。如果你不

  • 【讨论】有哪些事你觉得ASP.NET Core MVC能做,而ASP.NET Core RazorPages做不了?

    上一篇讨论中(https://t.zsxq.com/yVBaaUb),大家基本上都认同微软在RazorPages上的创新,并且实实在在的RazorPages在页面组织上有很大的便利,再配上FineUICore不遗余力推出的类似WebForms的TagHelpers标签,让开发变得很轻松。 其中,网友@大灰狼抛出了一个问题,就是说MVC中的Url.Action可以在不做任何改变的情况下,让生成的URL地址发生改变,比如将网址由:/NewsInfo/Index?id=28719改为:/NewsInfo/Index/28719.html 只需要在配置时,通过MapRoute来增加一个路由映射即可,类似代码:routes.MapRoute({"DefaultRoute1","{controller}/{action}/{id}.html}",newstring[]{"PayPlat.Controllers"}); 那么类似的功能在RazorPages中能否实现呢?    

  • 逆波兰计算器

    #include<stdio.h> #include<stdlib.h> #include<math.h> #include<ctype.h>//用来判断字符是不是数字 #defineOK1 #defineERROR0 #defineMAX_INIT_SIZE100 #defineSTACKINCREMENT10 #defineMAXBUFFER10 typedefdoubleElemType; typedefintStatus; typedefstruct{ ElemType*top; ElemType*base; intStackSize; }SqStack; //创建栈 StatusInitStack(SqStack*S){ S->base=(ElemType*)malloc(MAX_INIT_SIZE*sizeof(ElemType));\ if(!S->base)returnERROR; S->top=S->base; S->StackSize=MAX_INIT_SIZE; returnOK; }

  • Java数据结构与算法之冒泡排序、选择排序

    冒泡排序 4.1基本介绍 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。 4.2基本实现 冒泡排序规则 一共进行数组的大小-1次大的循环 每一趟排序的次数在逐渐的减少 如果我们发现在某趟排序中,没有发生一次交换,可以提前结束冒泡排序。 4.3代码实现 publicclassSort{ publicstaticvoidmain(String[]args){ //构建测试数组 int[]array={7,8,4,1,5}; int[]arr=bubbleSort(array); System.out.println("------------------"); System.out.println(Arrays.toString(arr)); } //算

  • 霍尼韦尔新风声音大

    这次买了霍尼韦尔的ER150N1CB,感觉声音有点大。需要吊顶以后能好些。

  • Makefile 系统论述

    该篇文章为转载,是对原作者系列文章的总汇加上标注。 支持原创,请移步陈浩大神博客: http://blog.csdn.net/haoel/article/details/2886 概述   什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。 这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile, 从一个侧面说明了一个人是否具备完成大型工程的能力。因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中, makefile定义了一系列的规则,来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

  • 10-4-表插入排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第10章 内部排序- 表插入排序 ——《数据结构》-严蔚敏.吴伟民版     源码使用说明 链接☛☛☛《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明     课本源码合辑 链接☛☛☛《数据结构》课本源码合辑     习题集全解析 链接☛☛☛《数据结构题集》习题解析合辑       本源码引入的文件 链接☛ StaticLinkedListType.c      文档中源码及测试数据存放目录:数据结构\▲课本算法实现\▲10内部排序\04TInsertSort   概述     表插入排序借助静态链表存储结构实现。表插入排序的基本操作仍是将一个记录插入到已完成排序的有序表中,和直接插入排序相比,不同之处仅是以修改2n次指针值代

  • It was not possible to find any compatible framework version

    Itwasnotpossibletofindanycompatibleframeworkversion Thespecifiedframework'Microsoft.NETCore.App',version'2.0.0'wasnotfound. -Checkapplicationdependenciesandtargetaframeworkversioninstalledat: \ -Alternatively,installtheframeworkversion'2.0.0'.  Theworkaroundfrommycomputerisbelow, Thereisthesameproblemwithmyproject,theworkaroundtoresolveitsuccessfullyisthatremovetheitem'C:\ProgramFiles(x86)\dotnet'fromthePathofEnvironmentVariablebecauseIfoundIdidnotinstalltherightnetcoreversionunderX86.Ihav

  • BookRead -《3D数学基础 :图形与游戏开发》 读后小结 - 矩阵变换深度理解

    BookRead-《3D数学基础:图形与游戏开发》读后小结-矩阵变换深度理解 目录BookRead-《3D数学基础:图形与游戏开发》读后小结-矩阵变换深度理解坐标系系统介绍多坐标系向量矩阵齐次矩阵矩阵和线性变换概述矩阵变换的理解矩阵变换的理解(0)-变换物体与变换坐标系矩阵变换的理解(1)-假设点的位置在不同坐标系中是不变的矩阵变换的理解(2)-假设点的位置随着坐标变换而变换矩阵变换的理解(3)-以旋转为例矩阵变换应用欧拉角和四元数欧拉角四元数矩阵、欧拉角和四元素的比较其他几何检测2D隐式直线上的最近点平面上的最近点null三个平面相交于一点射线和三角形的相交性检测AABB相关碰撞检测实现图形管道 注意:这本书中使用到的坐标系是左手坐标系,并且向量的空间变换是右乘矩阵实现,即向量x矩阵 同时本篇内容相对于其他相关文章的区别是,加入了个人对于矩阵变换的一些理解,其他详细的读书笔记可以参见这篇博文:https://blog.csdn.net/sinat_24229853/category_5643379.html 坐标系系统介绍 笛卡尔坐标系是就是直角坐标系和斜坐标系的统称。如下图所示:

  • CSP2019S组第一轮题解

    题目 答案及解析 (未完待续) 本作品由happyZYM采用知识共享署名-非商业性使用-相同方式共享4.0(CCBY-NC-SA4.0)国际许可协议(镜像(简单版)镜像(完整版))进行许可。 转载请注明出处:https://www.cnblogs.com/happyZYM/p/11716481.html(近乎)全文转载而非引用的请在文首添加出处链接。

  • 快排

    #include<iostream>#include<algorithm>  //在此#include<cstdio>#include<cstring>#include<cmath>usingnamespacestd; intcmp(constvoid*a,constvoid*b){ return(*(int*)a-*(int*)b);}intmain(){ inti,a[5]={3,4,1,2,5}; qsort(a,5,sizeof(a[0]),cmp);//第一个参数是数组名第二个是参与排序元素个数,第三个是元素占的字节大小,第四个如上 for(i=0;i<5;i++){  cout<<a[i]<<''; } cout<<endl; return0;}

  • linux xz 压缩 解压命令

    xz是绝大数linux默认就带的一个压缩工具,压缩率很高。 xz压缩文件方法 默认压缩等级是6.要设置压缩率加入参数-0到-9调节压缩率。 xz-z[文件名]   不保留原文件压缩 xz-zk[文件名]   保留原文件压缩复制 xz解压文件方法 xz-d[文件名]   不保留原文件解压 xz-dk[文件名]  保留原文件解压复制 创建或解压tar.xz文件:逐步压缩解压即可 创建tar.xz文件:先创建xxx.tar文件,然后使用xz-zk将tar文件压缩成为.tar.xz文件解压tar.xz文件:先用xz-dk将tar.xz文件解压成tar文件,再用tar文件来解包即可。

  • 关于在shell中直接修改文件名

    在shell命令行可以直接批量修改文件名,如 chengyanchun_cfDNA1.vcfchenyanshu_cfDNA1.vcfchibo_WBC.vcfgaomin_cfDNA1.vcfhuyuzhen_WBC.vcfliudianying_cfDNA1.vcfquhui_cfDNA2.vcf chengyanchun_cfDNA2.vcfchenyanshu_WBC.vcfdingping_cfDNA1.vcfgaomin_cfDNA2.vcfjinliyun_cfDNA1.vcfliudianying_cfDNA2.vcfquhui_cfDNA3.vcf chengyanchun_WBC.vcfchenyan_WBC.vcfdingping_cfDNA2.vcfgaomin_WBC.vcfjinliyun_cfDNA2.vcfliudianying_WBC.vcfquhui_WBC.vcf chenyan_cfDNA1.vcfchibo_cfDNA1.vcfdingping_WBC.vcfhuyuzhen_cfDNA1.vcfjinliyun_WBC.vcfquhui_c

相关推荐

推荐阅读