CUDA C BEST PRACTICE 笔记翻译 第三8章
# CUDA C BEST PRACTICE 笔记翻译 第三8章
中间的几章都是一些开发的一些基础,个人感觉用处不大,后面有时间再说,先搞一些我自己感兴趣的
8.性能指标
当尝试优化CUDA代码时,了解如何准确地测量性能并理解带宽在性能测量中所起的作用是重要的。本章讨论了如何正确的用 CPU 计时器和 CUDA 时间度量性能,以及探讨贷款如何影响只能指标以及如何应对这些挑战。
8.1 时间
CUDA 调用和核函数运行可以使用 CPU 和 GPU 计时器进行计时。本节将讨论这两种方法的功能、优点和缺陷。
8.1.1 使用CPU 计时器
任何 CPU 计时器都可以被用来测量 CUDA 调用和核函数的耗时。不同 CPU 计时器的细节不在本文的讨论范围之内。但是开发者需要了解所使用的计时器能提供的功能。
当使用 CPU 计时器时,记住许多 CUDA API函数都是异步的是十分重要的。也就是说,这些函数会在执行完自己的任务之前将控制权返回调用的 CPU 线程。所有的核函数启动都是异步的,有 Async 后缀的内存拷贝函数也是异步的。因此,为了准确的度量一系列 cuda 调用的时间,在开始 ...
CUDA C BEST PRACTICE 笔记翻译 第三章
# CUDA C BEST PRACTICE 笔记翻译 第三章
这次来第三章
3. Application Profiling
注 Profile这个词不太好翻译,我平常的理解一般是代指对程序进行各个方面的分析以找到瓶颈或者问题,后面我就都用 profile 了
3.1 Profile
许多代码用较少代码完成了大量的工作,使用 profiler,开发者可以定位到这样的热点,并开始编译并行化的候选列表
较少的代码完成大量工作,这里说的很模糊,我理解的意思是用少量的函数完成了大部分的计算,那么这块就有并行化加速的潜力。并行化候选列表我理解的就是看看哪些耗时多,这些就可以尝试用并行化来加速。
3.1.1 创建 Profile
有许多可能的方法来分析代码,但是目标都是相同的:找到花费了大部分程序运行时间一个或一系列函数。
对于任何分析活动,最重要的考虑是确保工作负载是真实的,换句话说,从这些分析测试中获得的结论和基于此做的决策与数据是相关的。使用非真实的数据会导致非最优的结果,开发人员会浪费精力在对非真实的数据规模上进行优化以及聚焦在错误的热点函数上。
有许多工具可以进行 pr ...
CUDA C BEST PRACTICE 笔记翻译 第二章
CUDA C BEST PRACTICE 笔记翻译 第二章
之前接触过一段时间的 cuda,但是自从工作之后就很少在碰 cuda 了,cuda 最近的发展可谓是日新月异,这次正准备阅读 cuda c best practice,趁此机会记录和翻译一下,也记录一下自己的见解(见解会用注解的形式标注)
这里是英文原文,想看原文的可以点这个链接
https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/
第一章是序言,搞点客套话,就不翻译了,直接第二章开始
2.异构计算
CUDA 编程 涉及到在两种不同的平台上并行地执行代码:有着一个或多个 CPU 的主机端(host 端,下文统称 host 端)和有着一个或多个NVIDIA-GPU 的设备端(device 端,下文统称 device 端)
注:由于在 cuda 里 host 和 device 是两个常用的概念,翻译成中文总觉得怪怪的,下文也都用 host 代指 CPU 端或者主机端,用 device 代表设备端或 GPU 端。
虽然 NVIDIA 的 GPU 尝尝与图形相关 ...
scp 后台传输
scp 后台传输
scp 面对大文件时尝尝传输的很慢,前台传有时候terminal一崩了就得从头再来,很考验心态
下面介绍下如何在后台进行scp
首先发起scp
1scp -r xxxxx:xxx xxxxx
之后按Crtl+z暂停,会提示 [1]+ Stopped xxxxxxx
之后输入
1bg %1
把任务1移动到后台运行,虽然移动到后台了,但是关闭窗口还是会让任务停下,这里我们可以用disown指令忽略挂起信号
1disown -h %1
之后就完事了,可以通过jobs指令查看当前任务
docker & nvidia-docker 安装
docker & nvidia-docker 安装
分3步
安装 docker
安装 nvidia-docker
修改镜像存储位置
安装 docker
官方文档https://docs.docker.com/engine/install/centos/
1234#安装一些依赖yum install yum-utils#添加 repoyum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
我在添加 repo 时运行yum-config-manager 报错 『No moudle named yum』。报错原因是 yum 使用的python 是 python2.7.5,而yum-config-manager使用的是2.7.2,修改为一致后解决问题
12345#安装 docker,如果之前有老版本的需要先卸载掉yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin dock ...
CUDA ERROR CHECK 宏
CUDA ERROR CHECK 宏
CUDA 代码出错时往往不会第一时间报错并终止程序,程序报错的地方可能并不是真正出问题的地方
可以利用自定义宏,方便的判断 CUDA 内置函数的返回值与检查cuda 程序运行状态,及时发现程序问题
12345678910111213141516171819202122232425262728293031323334353637383940414243444546#include<stdio.h>#define CUDA_SAFE_CALL(err) __cudaSafeCall (err, __FILE__, __LINE__)inline void __cudaSafeCall( cudaError err, const char *file, const int line ){ if( cudaSuccess != err) { fprintf(stderr, "%s(%i) : cudaSafeCall() Runtime API error %d: ...
Cmake 学习笔记1 cmake初探与参数传递
Cmake 学习笔记1 cmake初探与参数传递
最近需要在github上看一些项目,发现很多项目都是cmake编写的,看起来一头雾水,所以最近学习了下cmake相关的知识,在这个系列里记录下学习的痕迹。
最简单的cmake程序
首先cmake是一个自动化的构建,某种程度上可以理解为对makefile的一种封装,即可以通过更简便的方式来进行编译。
首先需要在文件夹下新建一个CMakeLists.txt,输入一下内容,这就是最简单的一个cmake文件
1234567#指定最低cmake版本cmake_minimum_required(VERSION 3.10)#项目名project(GYYPro )#生成可执行文件(项目名 源文件)add_executable(GYYPro tutorial.cxx)
之后新建一个build文件夹,并在里面运行cmake指令如下,当然也可以直接cmake,只不过为了文件夹看起来简洁易懂所以新建一个build文件夹,我认为这是个好习惯。
123mkdir buildcd buildcmake ..
运行完成之后便可以发现在文件夹下生成了一堆文件,其中包含 ...
解决 github.io 无法访问的问题
解决 github.io 无法访问的问题
最近遇到了github.io无法访问的问题,自己的博客也打不开了,开始以为是被墙了,但是google,github.com都是正常访问,后来经过一段搜索,发现修改DNS可以解决在这个问题。
可以在控制面板中打开网络的设置,将IPV4的DNS从自动配置改为手动配置。
可以修改的DNS很多,我这里使用的是233.5.5.5与233.6.6.6,这两个是阿里提供的免费DNS,也可以采用其他的配置,比如8.8.8.8之类的公共DNS,配置好之后便可以访问github.io网站了(如果还不行可以刷一下缓存)。
win10 安装WSL2(WSL升级WSL2)
最近需要配置个docker环境,win端的docker需要WSL2的配置,之前自己配置过一个WSL,现在记录下升级的过程,配置的过程应该也是差不多的。
首先需要在启用或关闭Windows功能中启用虚拟机平台
如果找不到这个虚拟机平台的选项,说明可能是家庭版的,可以通过一些命令添加,这里就不多说了,可以百度搜索,解答比较多。
之后下载wsl安装包进行升级
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
之后用管理员权限运行powershell,运行wsl -n -l,可以查看当前的wsl实例以及其版本,我这里已经升级过了所以VERSION为2
如果想对其中某个实例升级到版本2,可以通过命令wsl --set-version Ubuntu-20.04 2,这个命令可以将Ubuntu-20.04这个实例升级到版本2.
运行后重新启动下wsl便可以发现升级为了WSL2
ubuntu 依赖gmssl的程序编译
ubuntu 依赖gmssl的程序编译
由于实验需要从原来centos的环境换到了ubuntu的环境,实验所需的许多库都需重新安装。gmssl库的编译和安装都没有报错,顺利的make与make install完成。(安装可以参考官网http://gmssl.org/docs/quickstart.html)
编译我自己的程序(里面有对gmssl的libcrypto的依赖)也没问题,运行的时候报错
symbol SHA256_Update version OPENSSL_1_1_0d not defined in file libcrypto.so.1.1 with link time refe
搜了一下是因为编译连接的库连接到了ubuntu系统的库而非gmssl自己的库,由于他编译连接是会从LD_LIBRARY_PATH目录寻找对应的库,所以优先找到了系统自带的库。
为此有两种方法,一种是修改一下gmssl的Makefile文件,可以参考这个博客https://blog.csdn.net/sihuibin/article/details/102638630
第二种是export LD_ ...