windows 符号表预下载办法

windows下调试代码,有符号表和没符号表在某些方面的开发,差别较大,尤其是和一些windows基础库或偏底层的相关性较大的部分。巨硬的符号表服务器访问比较慢,一般为了能够快速进入调试模式,都是提前下好符号表,下面是根据遍历本机所有exe、dll进行符号表匹配并下载的命令

symchk /r C:\Windows\System32\ /s srv*D:\sym*http://msdl.microsoft.com/download/symbols

这样做只能加快本机调试的速度,对于其他环境上的dmp解析,远程调试可能用处不大,主要取决于系统中各类库的版本是否和本机的一致。

【C++】virtual与override

作为一个写c++98写习惯的人,对于c++11开始新引入的一些修饰关键字已经有些模糊,尤其是override已出现,整个人就有点困惑,并且在平日写代码里面还是沿袭了c++98虚函数重载的写法,被同组的小鲜肉鄙视(其实他种种高傲又和自身水平不相称的行为,我是相当鄙视的!),问其原因又未告知。果断看c++11书先了解。

首先看看下面两种写法:

//写法一:
class A {
public:
  virtual void A() = 0;
};

class B : public A {
public:
  virtual void A() {}
};
//写法二:
class A {
public:
  virtual void A() = 0;
};

class B : public A {
public:
 void A() override {}
};

本质上上面两种写法并无太大差别,由于A这个类是纯虚类,子类只要存在有函数没有进行重载,编译阶段结汇出现报错,此时override在这里可有可无,区别不大。

但如果是下面两种写法,override就体现了作用

//写法一:
class A {
public:
  virtual void A() = 0;
  void A(const int a) {}
  virtual B() {}
};

class B : public A {
public:
  virtual void A() {}
  virtual B();
};
//写法二:
class A {
public:
  virtual void A() = 0;
  void A(const int a) {}
  virtual B() {}
};

class B : public A {
public:
 void A() override {}
 void A(const int a) override {}
 void B() override;
};
  1. 由于带参数的A函数是非虚函数,仅仅可以通过“覆盖”的方式进行,而使用override进行修饰,将会报错属性错误。这样可以用来检查类继承时候,成员函数属性错误的情况
  2. 由于加了override,在编译阶段,写法二会检查B函数在子类中是否已经被实现,如果没有实现会报错。而对于写法一来说,只有子类的B函数被使用到的时候,才会在链接期进行检查。这样可以提早发现代码漏实现的情况。

一些代码优化中的小技巧(表达式优化部分)

奇偶数判断优化

一般情况下判断奇偶数都是用

if (0 == a % 2)

但可以优化为:

if (0 == a & 1)

取偶与取奇

有时候需要对一些数进行取偶,那么代码可以优化为:

取偶:a += a&1
取奇:a += 1-(a&1)

【docker】容器中启动syslog

公司代码用了syslog,但由于一般公版的docker基础镜像里并没有syslog服务器。因此需要做个单独安装。

启动镜像后执行如下命令,即可完成syslog服务的安装和启动。

apt update && apt install rsyslog -y
rsyslogd

通过一下命令测试一下

logger "test"

在/var/log/syslog中出现了刚才的日志就说明服务安装成功。

【英伟达】高负载下nvidia-smi对性能的影响

最近在测试一个T4 gpu执行性能的问题,通过nvidia-smi来对显卡的运行效率和状态进行收集和统计。

在使用的过程中发现,该工具不同参数下对性能的影响不同。负载情况如下图。

任务为20个720p 15fps的视频转码+推理任务。相当于每秒钟执行4500次解码+4500次编码+4500次推理。

在执行nvidia-smi dmon时,发现性能影响很小;执行nvidia-smi pmon时,性能影响相对明显。

由于没有找到比较详细的信息和解释,初步推测和性能采样有关。pmon模式下,需要对每个进程做采样,会降低一些执行性能。

linux信号量那点坑

在用户角度来看,linux有两种信号量,system v和posix两种。

之前由于需要快速开发出东西来,就随便选了一个信号量来使用,后来才发现是system v,在使用过程中也遇到了一些坑。

sem_key_ = ftok(“file_exist”, 'a');

int flag = 0666;
flag |= IPC_CREAT;

sem_id_ = semget(sem_key_, 1, flag);
if (-1 == sem_id_) {
  std::cout << "semaphore create failed" << std::endl;
  return;
}

union semun sem_union;
sem_union.val = 1;
if (semctl(sem_id_, 0, SETVAL, sem_union) == -1) {
    std::cout << "semaphore semctl failed" << std::endl;
    return;
}

这里需要注意的是,ftok的第一个传入函数必须要某个存在的文件,因为需要通过具体的文件,去访问对应的nodeid,并做hash值。如果文件不存在,那么返回值将会是-1。

debian对非lvm文件系统分区扩容

在安装linux的时候,如果选择了lvm文件系统,当某个特定分区文件不够用的时候,直接通过resize即可实现在线动态扩容分区。

但由于当时为了减少一些开销,并没有使用lvm作为中间管理器,直接使用物理磁盘的分区。

debian是运行在vmware中,对于磁盘扩容比较简单,只需要进行配置一下,磁盘大小即可进行快速伸缩。

设置好vmware磁盘后,进入linux后执行fdisk -l检查硬盘大小,已经生效。

可以看到磁盘总大小200g,sda1+sda2还保持在75g。这时候执行apt install gparted后运行分区工具。

这时候先禁用swap分区,并删除swap对应的逻辑分区,接着执行修改sda1分区大小。

设置成需要的分区大小之后,在对剩余的空间执行创建对应的swap分区。然后执行mkswap /dev/sda5,查看swap分区的uuid。

执行nano /etc/fstab,修改对应的swap分区uuid,重启后即可。

【nvidia gpu】Ubuntu 18上安装cudnn环境

公司大佬用cudnn写了一个推理库,用于做背景分割。新到一台用于做测试的服务器,但sre和it都不管我,而我又是集成这个cudnn的人。所以只能自己亲自上,淡然还有大佬的帮助下成功安装了系统和驱动。

准备工作,一个新安装的ubuntu server 18。

下载好驱动、cuda、cudnn、tensorrt:

NVIDIA-Linux-x86_64-418.165.02.run

cuda-repo-ubuntu1804-10-1-local-10.1.243-418.87.00_1.0-1_amd64.deb
cuda-ubuntu1804.pin

libcudnn7_7.6.5.32-1+cuda10.1_amd64.deb
libcudnn7-dev_7.6.5.32-1+cuda10.1_amd64.deb
nv-tensorrt-repo-ubuntu1804-cuda10.1-trt6.0.1.5-ga-20190913_1-1_amd64.deb

其中需要注意的是,除了显卡驱动,其他部分都要下deb包,否则会出现打不上的情况。

然后按照教程的路线,执行dkpg -i和api install就好

葫芦七兄弟故事(一)

首先提一下葫芦七兄弟这个标题的缘由,因为在2020年4月,本人换了一个工作,进入了某A公司(不是不爱钱的那人开的公司);这个公司在现阶段是在线实时音视频做的还不错的一家,无论知名度还是市场占有率,都确实到了一定高度。

选择这家公司的原因其实也蛮简单的,主要是想通过公司的平台,对自身的技术有个提高和成长。加入公司以后却看到的不是成长和学习,而是首当其冲的就是被拉去支援隔壁大部门的工作,接着就是被各种神仙之间掐架时候的各种有意无意的误伤(说白了就是拿我指桑骂槐)。

显然透过这样的工作体验是奇差无比的,况且这里面也感到了一丝丝各种奇奇怪怪的工作氛围。

入职到今天,已经经过了9个月了。最近听到隔壁部门在做一些人员架构上的变动,听到这个消息的时候,实际上心里是有些不太舒服的。原因是隔壁组的老大要换,而过来的老大就是当初就是“恶心”过我的人。

书归正传,为何会写这个东西?

还是相对自己目前的工作状态和心里状态做一个回顾和梳理,避免一而再再而三的出现问题,反反复复的出错。同时也便于做一些及时的心态调整和变化。其目的还是为了减少这些糟心事对自己的影响,也可以适当的让自己有机会和精力朝着自己的目标去进行。

为何这样取名?

因为组里有7个人,而这7个人各有所长,也各有自己的性格特点。所以叫葫芦七兄弟比较贴切和理想。

这七个人是什么样的特点?

在我心里,这7个人的特点:

  • 老大,有自己的想法和目标,也有一定的能力,思维活络。但也许由于一些原因,又或许自身的性格特点,自己很少做一些团队工作方面的输出。或者说,在我眼里,在一些团队带领方面没有体现出管理者应有的素养(实际上很多管理者都没有)。我的新员工导师,导师这块我觉得还缺少了一些工作方面的引导(代码)。
  • 老二,年纪不大90后。不太爱多说,性格特点比较主观,有一定自我或自负的情况,不通融,不豁达。工作技能有一些比我强的地方,但可能由于一些因素,或自身自负的原因,似乎并不以为然。
  • 老三,年纪应该很大(应该是70后),似乎是做编解码出身的。起初打交道的时候,感觉还不错,能够提出一些正向且积极的意见和建议,但细细接触后发现,做事情有点拖沓,人水平不错。如果人能放下一些身段,踏实一些,不管是技术之路,还是管理之路,我相信都会不错很多。加上确实技术上有一定水平,我会很乐意找他做我的老师。
  • 老四,我。脾气大,不喜欢得罪人,但也不是什么老好人类型;不愿意直接面对工作上的矛盾;同时是一个说话“啰嗦”的人(这里面分为有真的啰嗦成分,也有别人有意或无意找的接口!)。技术功底一般,技术技能比较杂,不想一直这样杂下去,想沉淀某种技术。对目前团队信任感缺失,不太想发言,或者说在等待能够把自身感兴趣的技术做下去做深的机会。
  • 老五,其实老五和老六是同一天入职的。但后来听说老五本来也应该是4月份日志的,所以就区分开两个人了。老五是某不爱钱老板开的公司出来的,起初感觉还挺不错的,但后续不晓得是不是什么原因还是怎么的,总感觉老五做事会有几分此地无银三百两的情况;所以当时还在对老五做了一些留意和观察,对他还是尽量抱着友善的态度,但持续保持适当的距离。据说以前是做android media framework移植裁剪和维护等(搞android os里面),人技术应该挺不错的,但给我感觉做事目的性太强了,我有点怵,所以敬而远之。
  • 老六,人其实挺不错的小伙的。就是给人感觉太爱表现了,说话做事有很多时候很喜欢信口开河,对技术了解不深不扎实的情况下,也会随便说出来。人本身也许没有太多坏心眼,但是太急躁没什么好处,有时其实我也挺烦和他打交道的,说话给人感觉很喜欢瞎指挥,太把自己当回事的情况,而且影响别人的工作效率;夹带私货(心)的时候有点多,成分也有点明显。有几次我真的忍不了,搞不懂他到底想要干什么,如果技术top1的话到还没啥好说的,关键是没到这个水准,做事的那股样子给人就一个大佬的错觉样,确实很难受。有很多时候,我并不想和这种人打交道,因为提高太少了。
  • 老七,刚来。目前看上去还是挺谈得来的样子。和老大在同一个办公地点,最近活跃度降低了不少,预计身上事情在变多了。或者其他原因,后续再看。

今天先写道这里了,下一篇,我想重点写一写七兄弟,我对他们六个人的看法和感受,以及我所了解到他们可能对我的看法或感受。

2020年总结

本文来自我在老家的一个IT社区发的总结,直接复制过来。

为什么发这个话题

步入中青年阶段,想法开始复杂起来了。(就连装X都不在那么的简单粗暴,而是采取了更为凡尔赛的做法)
心中的困惑越来越多,曾经的疑惑少不少,也懂了是是而非和利弊权衡。说话学会了装腔作势和假装诗情画意(2333,单身狗相亲被虐出的技能)。

  1. 有时候,都快怀疑自己是不是成为了当初那个最讨厌人的样子。 夜空中最亮的星 – 逃跑计划
  2. 有时候,怀疑自己是不是选择和坚持是否是错的,或者不恰当。李白 – 李荣浩
  3. 有时候,想改变现在的状态。Say Yes – MKLA
  4. 有时候,那个人怎么这样,算了不想说了,说了没用,说多了还搞的大家伤和气,我还是买包瓜子和一个西瓜吃好了。演员 – 薛之谦
  5. 有时候,一直在问自己做人到底需要不需要继续保持着友善?(这里就不放歌了,Marilyn Manson的歌比较那啥)

回首过去

  • 小时候贪玩,高中中二且不听长辈的话,后来混了个大学文凭。
  • 毕业那个时候,看个网络新闻还管叫做“冲浪”,手机还是”hello moto”的黑白机;当时纠结于回老家,还是在外务工的选择。
  • 出于对专业的兴趣与常年叛逆的习惯,所以选择留在外面继续当一名代码施工人员。一晃十多年过去,母胎solo多年。看到严大大的回家帖子,我当时第一个反应是,喜提“勇于做决定和改变”。当时也心动了,原因很复杂。
  • 抱着试试的态度,2019年,分别选取了4个周末的时间回昆明分别实地踩点了几个处,同时也很荣幸的见到了社区的几位大佬,短暂的接触后,我就回所在的务工城市。这4次的实地踩点与同行/非同行沟通下来收获很多,也从各位昆明通那里学习了解到了很多信息和风土人情;很遗憾的是,我最后得到了一个结论:“尽管我也是一个土生土长的云南人,但我需要很多时间去调整和适应,两种地方民风民俗的差异,并积极融入和端正心态;已经接受并可能由此带来的一些落差”,这个过程中严大大着实打醒了我不少。
  • 2019-2020,继续围城,继续怂,继续修福报。一睁眼一闭眼一年就过去了,老男人又老一岁了。

现在

  1. 都说程序员要掌握四门基本功课,坑蒙拐骗,哦,不,是CRUD。混社会也有些时间了,坑的话,自然手到擒来;蒙,这个还行,对付一下QA基本够用;拐的话,还不太会,主要是不太喜欢内推和拉帮派啥的;骗,这个只能说还需要继续提高,毕竟现在都是互相骗的年代,招聘常年挂着,实际上就是不招人,找工作的简历注水,各种架构嘴到勤来。每天一个big story,距离上市又进了一步。
  2. 想沉下心来做事情,不想做业务,只想做纯纯的技术;可惜公司目前还没给这个机会。
  3. 羡慕别人自由,不需要为了下一顿操碎心。也羡慕别人能为了自己的梦去追寻,哪怕生活看上去没有那么华丽。
  4. 家里的是太多了(主要是长辈们的鸡毛蒜皮的矛盾),每年过年回家都快麻木了;听听就过,基本没进脑子,不管什么事,即便是教我如何做人的方面,只要不听就对了,越不听还越不见得混不下去。能够吸收这些经验的一部分同辈人(包括行为风格),情况有点不太好。
  5. 在外组建的老乡聚会,回家建设的大军在逐渐壮大,还留守务工的亲们的心,也在渐渐离去。或许是当初我太理想,又或许这就是社会阶层的不同,又或许我不配,又或许生活压倒人心。
  6. 自从上次骨折后,我的山地车也很就没骑了,虽然不愿提起,其实还是心理有所回避;太怕自己玩嗨了,又搞惊险刺激的骑法。

未来

  1. 加油吧,打工人。为构建老板不爱钱计划,努力吧打工人。
  2. 往走好30岁这个阶段的年纪,尽量成为一个不惑而有豁之人。
  3. 琐碎哪些破事少一点。

不变的梦想

  1. 有房
  2. 有个旅行车(汽车)
  3. 有辆维斯帕(300cc 就好)
  4. 有足够养老的钱

刚步入2020年11月,秋意似乎不太浓烈。不晓得今年的秋天会维持多久便会进入冬。

年底将至,2019年和2020年经历了一些看上去还是比较大的事情,而也正是这些事情可能会带给我今后一些人生轨迹和选择偏好有很大影响,也正因为如此,也才需要。

首先老生常谈的继续回顾毕业以来,或读大学以来自己的变化。

准备去读大学的时候 – 狂,因为考上大学了,以为自己牛逼了。

在大学里的时候 – 迷茫,在大学里没了保姆一样的老师,而是拥有者一大堆“不负责任”的老师存在。长时间和同学背井离乡的在一起时,真的有很多诱惑和“危险”(主要是自己对是非的判断上)。

大学毕业时 – 被迫接受现实,其实很简单,因为教育已经成为一种大众化商品。这不仅意味着大学在扩招,同时也意味着,大学教育不再要求继续强调单一技能过强。

工作第3年 – 接受现实,互联网这个概念的逐渐进入大家的视野,房价逐渐的暴涨;同时大家为了利益而渐渐“淡漠”。

工作第6年 – 为了自己,程序员圈子也渐渐的开始进入“关系化、圈子化、帮派化”。自己不太喜欢这种类型的社交,认为这样的社交太累,所以想让自己还在“年轻”的时候,多充实一些自己的工作技能,以此来规避“社交问题”方面的短板。

工作第9年 – 小拐点、棱角钝化渐渐凸显, 小拐点主要是还是工作和生活上都双双出现变化,有喜也有忧。经过社会毒打这么多年,棱角也渐渐钝化了一些。

工作第10年,遇到了很多问题,也渐渐的学会了一些问题的处理方式,心态也慢慢的平淡了很多;也懂得了舍与得。

其实我现在比较迷茫的是和人打交道方面、技术成长上。对于技术成长我所能做的就是选择相对正确的方向去努力,对于与人打交道方面,我就比较迷茫。

因为我在意很多方面:

1,和人打交道是很耗费精力的事情,不管是锻炼和掌握技巧,还是运用技巧。

2,我怕入戏太深,失去自己比较宝贵的品质

3,真的值得这样去改变吗?

以上这些情绪,某种程度上是可以看作是:患得患失+迷茫+固执的综合体。

要解开这个情况,我想所能做的还是先从遇到的一个沟通对象类型开始分类。

我遇到过的人里面,都有些什么样的特征?

  • 自负,自负的人最可怕,也容易被利用。因为这类人往往过于忽视自己的弱势,乃至很多时候并不关注幻想与现实中自己的差距有多大,容易沉醉在自己的“成就”中,或多或少的会放大自己的重要程度。以至于出现在某个领域和所有领域中都有无所不能的情况。与这类人沟通最累,而且累的最为简单。所谓最累且最简单,是因为这类人多数沟通起来,只需要适当的言行符合他想,或能够满足他自身的自大欲望,便可。如果在重要位置或领导位置,有可能比较难处理。因为有可能会出现对方自负其来会胡乱责怪队友的,猪一样的行为。
  • 懒惰,这里说的懒惰,主要还是指一些投机取巧,把事情推出去给别人做,这类人有别于推诿。这类人是单纯只想拿钱不干活,但又愿意把事情交出来给别人,或者类似磨洋工。这类人其实我很不会打交道,一方面是因为我自己的性格现阶段很难包容这类情况,另一方面这类人有时候会影响到他人事情的进度,有时候还会让人出现两难的情况。处理这类人最简单的办法,很多都是直接把时间拿过来做掉。
  • 推诿,推诿这个就比较难说清楚了;因为这里面会有很多主观评价成分在面。这类感觉主要还是在于事情不想做又不愿意交出来,或者想找点接口刁难一下,或者鸡毛当令箭的情况等等。这类人一般不好弄,基本是靠关系解决的问题。关系建立就比较复杂了。
  • 傲慢,傲慢的人基本都有种自命不凡的心态伴随着。这些人总觉得自己高人一等,这些人一般确实在某个方面会比他看不上的那些人会有一些优势。面对比自己更有优势的人,他们有承认自己不行的一面。傲慢的人,主要是还在于地方远不远沟通,如果愿意还是有机会调和沟通。如果不愿意,甚至难以沟通,那么敬而远之也只是某种下策。
  • 偏激,这种人做事情一般容易走极端,或极端化。以前的我就是这样的。偏激是一种特征,很难去衡量好坏,多数时候需要积极制止,但制止的方式方法很重要。
  • 唯利是图,这种人基本就是只看重利益了,利益是最重要的。不同的人程度会有所不同,有些程度比较重的人,就很危险。程度轻一些的,还可以适当的包容。
  • 帮派,有人的地方就有江湖。帮派这个东西,有好有坏,取决于帮派成立的初衷以及运作的目标。有些帮派属于纯粹技术累帮派,只要技术类型恰当也未必是坏事。但是如果是利益集团的帮派,那就比较复杂了。因为利益始终伴随着大量的复杂事情和问题的,这种帮派里牛鬼神太多,很难处理问题。
  • 论资排辈,有人的地方就有江湖。论资排辈的好处就是对“老人”给予足够的尊重和认可,但弊端就是“老人”的刚愎自用问题。这种情况下,很麻烦。
  • 友善,友善的人会有一定的人脉资源,但不见得就很多。因为人善容易被人欺,这也是越来越严重的一个社会现象。但友善确实可以在社交中甄别很多类型的人,这也可以视为一种试金石。
  • 真诚,真诚的人,也容易被人欺。因为也许你的真诚别人并不领情,或者觉得理所应当,或者简直就是多余。但真诚的本质是容易简化沟通,因为可以省掉很多猜疑、猜测、顾虑,容易建立默契。
  • 青涩,青涩其实是一种不成熟的表现。但也是最关键的时候,拥有社交青涩的人,往往有机会发展很稳固的长期社交关系。但也由于一张白纸,也容易被社会这个大染缸,染的五颜六色。

以上就是按照几种维度进行的分解,大部分人都拥有以上的几类情况,或一类情况。

本来就单单一类就够受了,有些类型的情况放在一起,真的有种极品的感觉。

其实我很难去运用比较恰当的方式和方法去应对社交中遇到的一些人,从品类上讲来说,真的太复杂。从我个人心态上讲,有时候真的于心不忍。

毕竟有句话叫做:“可怜之人必有可恨之处”。现在唯一做的比较还行的,就是心态上的快速调整和长期建设,能够适当的控制自己的心态,尽量不去影响其他方面的事情和做事节奏等等。但一遇到打交道的场合,就有种力不从心的感觉,想逃避是一方面,另一方面则是厌恶甚至是恶心。

在这块上,有时还只能拿那些不太难打交道的人来练练手,试着用几种沟通方式和方法来测试效果。同时也在和各种类型的人打交道时,尽量保持一定周期的回顾自身的情况和言行。

适当的做出一些调整和可行性的方案,有时真的挺难的。

先就这样吧,纠结了几个晚上了。难得的一次练手机遇,适当试试看。

【英伟达】nvenc/nvdec/sm关系猜测

因为不是做cuda相关开发,临时被拿来做调试一些相关代码。看到官方的一些介绍并不是很清晰,并没有完全说明cuda计算单元和nvenc/nvdec关系。仅仅提到nvenc和nvdec是两个编解码引擎。

并且还对特定显卡做了nvdec和nvenc的限制,对于一些老卡上,并没有nvdec和nvenc引擎。

官方给出的定义是nvdec、nvenc是独立于cuda核心,并不是很理解。或许nvdec和nvenc是相对于cuda核心的单纯的计算功能而划分出来给视频编解码使用的一个特定模块。

上网查了一下,以前的GPU加速编解码,实际上是利用cuda计算单元做一些数学计算,加快编解码速度。而nvenc和nvdec可以直接未编码数据或已编码数据进行处理。

那么这里就很好奇了,nvenc是一个单独的物理模块,还是一个逻辑模块。

通过对比实验发现还是稍有区别:

  • 第一个实验,仅使用nvdec、nvenc,以及ffmpeg的混流滤镜。得到的数据如下:
  • 第二个实验,通过外部加载一个推理模型。将解码好的数据丢给推理模型进行推理后,再返回解码,所有的过程均在显存中进行。

通过nvidia-smi dmon,可以发现除了流处理使用率有所增长,在程序初始化初期,从数据是上来看,可以推测nvenc和nvdec实际上还是利用到了部分流处理器,至于把这些流处理器拿来做什么就不得而知,也许只是作为解码初始化的一些树的加速计算,也许仅仅是被划分到nvenc、nvdec中参与编解码工作。

后续还需要一些相应深入和系统性的了解才好做判断。

【linux开发】semop执行出现EINTR错误

用信号量来做共享内存的互斥操作,执行semop阻塞式调用。

结果发现执行p操作(加锁)会较低概率不定期的出现EINTR失败,查看linux手册,看到如下片段:

也就是当线程正在对信号量进行操作时,刚好出现该线程捕捉到了一个信号,这时候刚好接收到某个信号执行了相应信号的相应中断处理函数。

这主要是由于信号是以进程为单位,而具体某个信号会被进程内部的哪一个线程执行,这是极有可能不可预知的(主要有操作系统而定)。因此在这种情况下时,如果semop执行出现了一个EINTR错误,那么只需要再次重启调用semop就好。

解决这个问题的办法有两个:

1,通过屏蔽掉大部分该线程不关心的信号来解决,但是这样有可能会出现误屏蔽的操作情况。

2,单独开启一个线程来执行sigwait,作为信号处理线程。

【英伟达】显卡无法正常工作的线索

前提条件

显卡类型:专业显卡

特征:具备内存ECC,和一些特定的纠错能力,其他暂时不清楚。

SRAM报ECC错误,导致申请显卡资源失败。

该问题是使用ffmpeg通过cuda api进行申请显卡资源出现报错,或出现长期卡顿不动的情况。出现该问题时,一般均为向驱动产生较高的并发请求,并伴随着相对高一些的负载情况下。

透过nvidia-smi可以看到相应错误为:

可以看到SRAM的错误计数器已经很大,并且是无法纠错的部分。sram又常常被用于寄存器,所以出现这类错误时,gpu状态已经出现异常了,且nvidia官方仅仅提供了显存页的重定向(“退休”),并没有相应寄存器的不可纠错异常处理,因此再这样的情况下时,只有通过重启硬件来尝试解决,并通过nvidia-smi重置显卡。

不过在官方的文档里,如果30天出现5次以上的SBE,基本就可以考虑返修。对于SRAM错误,估计也是离返修不远了,除非是纯vbios或其他软件部分的问题。

参考信息:https://docs.nvidia.com/deploy/dynamic-page-retirement/index.html

【英伟达】显卡官方名称的一些术语

最近在做一些编解码相关的优化,以及前段时间隔壁同事在做一些机器学习相关的内容。

当时公司配了T4、V100、T100的卡。一直并不真正理解专业卡和消费级卡到底有什么区别,为何要买。

  • 以前了解到的专业卡和消费卡的主要区别:

消费卡的渲染仅仅做表面,而专业卡会连同三维模型的内部也一同进行渲染,因此在相同流处理器数量一样的情况下时进行三维渲染时,消费卡输出图形数量会比专业卡极有可能更快,因为渲染步骤会少很多。

另外就是流处理个数不同,相同GPU核心大类的情况下,专业卡的流处理数量会比消费级更多。这些也仅限于之前的了解,包括gt8600时代的认知,因为后面的gpu核心架构变化比较大。

  • 现在挑选显卡需要了解几个术语:

cuda单元:NVIDIA显卡的基本计算单元,这个实在硬件设计时已决定,但也不排除实际数量大于配置数量,故意做了屏蔽的情况,比如之前就出现过一些gtx显卡的gpu芯片中的cuda数明显大于该卡宣称数量,其中有些网上解释为工艺问题,导致较高端卡批次不合格,降级为低端卡卖。类似intel和amd cpu工艺不达标降级达标卖一样。

流处理器:single Instruction MultipleThread,SIMT,可以看做是若干个cuda单元组合成的一个逻辑处理器。nvidia-smi中的sm就是流处理使用率。这个的数量由驱动和硬件配置来决定。

显存:不解释。但专业卡普遍支持ecc,消费级要近几年高端卡才有。在做一些要求可靠性高的计算时,这个很关键。

nvenc:nvidia的编码引擎,非开源,按照官方的介绍,这是由驱动+cuda构成,但网上又说这个也有独立的硬件模块存在。没有做过深入了解。

nvdec:nvidia的解码引擎,和nvenc类似。

cuvid:nvdec旧名,但不清楚两者真实的差别。

浮点数:这个在gpu上很受关注的问题,由于编解码,机器学习都需要用到。所以gpu在渐渐把支持的越来越好。

定点数:起初gpu做浮点数模拟的时候性能太差,导致性能比较差,因此之前的都是采用定点数来计算小数问题。精度丢失相对严重,导致编码出数据和计算结果有较大的误差。现阶段由于编码器算法的改进,这块失真在逐渐减小,以及浮点数的支持,也相对好很多。不过在机器学习上,还是很突出这块问题。

如果是做机器学习相关,可能在cuda数量方面会需要比较关注,同时还需要关注显存大小,据说模型加载也很耗显存。这块没做太多深入了解

如果是做视频编解码加速,那么需要关注nvenc和nvdec配置的数量,不同的卡配置数量不同。一般nvdec只有一个,nvenc会有大于一个的情况。同时nvdec和nvenc的能力也会不同,主要体现在支持的颜色空间,支持的编码参数等。

另外就是显存大小也要重点关注,一些分辨率和编码参数下,显存会成为一个比较主要的瓶颈。